2012-11-29 16 views
9

Questo funziona ...Usa decltype e std :: funzione con lambda

auto x = 4; 
typedef decltype(x) x_t; 
x_t y = 5; 

... e allora perché non fa questo?

int j = 4; 
auto func = [&] (int i) { cout << "Hello: i=" << i << " j=" << j << endl;}; 
typedef decltype(func) lambda_t; 
lambda_t func2 = [&] (int i) { cout << "Bye: i=" << i << " j=" << j << endl;}; 

... e come dovrei dichiarare lambda_t manualmente utilizzando std :: funzione?

risposta

14

... quindi perché non funziona [lavoro]?

Poiché ogni istanza lessicale di un lambda ha un tipo diverso. Non importa se si usano gli stessi personaggi.

.. e come dovrei dichiarare lambda_t manualmente utilizzando std :: function?

Il lambda prende un argomento int e non restituisce nulla ... Quindi:

tipi
typedef std::function<void(int)> lambda_t; 
7

lambda sono indicibile (non può essere chiamato), che è la ragione per cui non si può fare ciò che si stanno chiedendo Oltre a ciò, ogni lambda è di un tipo diverso, quindi anche se potessi dare un nome al tipo, non saresti in grado di assegnare il secondo lambda al primo. Se si pensa alla sintassi lambda come una scorciatoia per un oggetto funzione che diventa più chiaro: il membro operator() è diverso per ogni lambda e quindi sono di tipi diversi.

È possibile, d'altra parte, assegnare un lambda a un oggetto std::function<> della firma appropriata, che nel vostro caso sarebbe std::function<void(int)>.

+0

Si può certamente typedef lambda con decltype come quello. –

+1

@ R.MartinhoFernandes implora la domanda perché 'decltype (func)' non restituisce 'std :: function ' invece di una inutile spazzatura? – learnvst

+1

@learnvst: Perché dovrebbe? 'decltype' restituisce il tipo dichiarato, e un lambda è * not * a' std :: function'. Inoltre, 'std :: function' ha implicazioni sulle prestazioni, tra le altre cose, grazie alla cancellazione del tipo. – Xeo

0

Ecco alcune prove solide che questo non funziona. Scenario simile:

int foo = 3; 
int bar = 3; 

std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints one -- obviously - they are the same type 

Ora, consente di utilizzare lo stesso codice esatto, ma con lambda. Cosa pensi che la risposta sarà.

auto foo = [](){std::cout << "HELLO\n"; }; 

    auto bar = [](){std::cout << "HELLO\n"; }; 

    std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints 0 -- different type even though they are declared exactly the same. 
Problemi correlati