2010-06-07 17 views
28

Próbuję przekazać wyrażenie lambda do funkcji, która ma wskaźnik funkcji, jest to możliwe?Czy wyrażenie lambda można przekazać jako wskaźnik funkcji?

Oto przykładowy kod używam VS2010:

#include <iostream> 
using namespace std; 

void func(int i){cout << "I'V BEEN CALLED: " << i <<endl;} 

void fptrfunc(void (*fptr)(int i), int j){fptr(j);} 

int main(){ 
    fptrfunc(func,10); //this is ok 
    fptrfunc([](int i){cout << "LAMBDA CALL " << i << endl; }, 20); //DOES NOT COMPILE 
    return 0; 
} 
+0

Kompiluje i uruchamia z gcc-4.5.1 na Linuksie (ale nie kompiluje się w wersji 4.4.3, która nie ma lambdy) – Cubbi

Odpowiedz

26

W VC10 RTM, nie - ale po funkcja lambda w VC10 została sfinalizowana, a średnia komisja nie język, który pozwala dodać bezpaństwowców do lambdy degradacja do wskaźników funkcyjnych. Tak więc w przyszłości będzie to możliwe.

+0

Czy pamiętasz, w której sekcji? To jest interesujące. – rlbond

+3

@rlbond: N3090/3092, §5.1.2/6 –

+0

Bezstanowa lambda oznacza lambdę, która nie przyjmuje zmiennych lokalnych według wartości lub odniesienia? – balki

0

Nie. Nie może. Niezawodnie przynajmniej. Wiem, że VS2010 implementuje je jako funktory obiektów. W zależności od tego, jak działają, może to być wymaganie określone w postaci .

13

Można użyć do tego std::function:

void fptrfunc(std::function<void (int)> fun, int j) 
{ 
    fun(j); 
} 

Albo iść całkowicie ogólna:

template <typename Fun> 
void fptrfunc(Fun fun, int j) 
{ 
    fun(j); 
} 
4

Działa to w VS2010:

template<class FunctorT> 
void* getcodeptr(const FunctorT& f) { 
    auto ptr = &FunctorT::operator(); 
    return *(void**)&ptr; 
} 

void main() { 
    auto hello = [](char* name){ printf("hello %s\n", name); }; 
    void(*pfn)(char*) = (void(*)(char*)) getcodeptr(hello); 
    pfn("world"); 
} 
+0

to nie działa ... wyjście, które otrzymuję, to jest powitanie _ – subzero

0

Dopóki nie lambda użyj klauzuli przechwytywania (tzn. nie przechwytuje zmiennych od niej), może być używana jako wskaźnik funkcji. Kompilator VC wewnętrznie generuje anonimowe funkcje z różnymi konwencjami wywoływania, dzięki czemu można z niego korzystać bez problemów.

Powiązane problemy