2016-02-24 12 views
9

In questo scenario:Cast oggetto funzione std torna a funtore struct

struct Holder { 
    std::function<void()> f; 
}; 
struct Functor { void operator()(){ /**/ } }; 
int main() { 
    Holder = { Functor{} }; 
    //... 

Esiste un modo per lanciare in seguito f di nuovo ad un tipo Functor?

+0

La risposta breve è: no. Questo è tutto ciò che "cancella il tipo". –

+3

@SamVarshavchik: la risposta leggermente più lunga è "sì": -S –

risposta

8

La funzione membro target è il cast di tipo non digitale di std::function. Dovrai conoscere il tipo di target:

#include <cassert> 
#include <functional> 

struct Functor { void operator()(){ /**/ } }; 

int main() 
{ 
    std::function<void()> f = Functor(); 
    Functor * p = f.target<Functor>(); 
    assert(p != nullptr); 
} 
+0

[Demo] (https://ideone.com/7HaQ95) –

+0

Questa affermazione è una buona idea, probabilmente dovresti metterla in evidenza un po '. AFAIK non acquisisce la proprietà dell'istanza di destinazione (indicata come), sai se è garantito che rimanga valido per tutta la durata dell'istanza della funzione std? –

+0

@DanielJour: Se riassegni o scambia l'oggetto funzione, perderai sicuramente il bersaglio trattenuto. –

Problemi correlati