2010-06-07 19 views
28

Estoy tratando de pasar una expresión lambda a una función que toma un puntero a la función, ¿esto es posible?¿Se puede pasar una expresión lambda como puntero a la función?

Aquí hay un código de ejemplo, estoy usando 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

Compila y ejecuta con gcc-4.5.1 en Linux (pero no compila en 4.4.3, que no tiene lambdas) – Cubbi

Respuesta

26

En VC10 RTM, no - pero después de la función lambda en VC10 se finalizó, el comité norma añadía lenguaje que permite a lambdas apátridas degradar a indicadores de función. Entonces en el futuro esto será posible.

+0

¿Recuerdas en qué sección estaba? Esto es interesante. – rlbond

+3

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

+0

Por lambda sin estado, ¿se refiere a una lambda que no toma las variables locales ni por valor ni por referencia? – balki

0

No. No puede. No confiablemente al menos. Sé que VS2010 los implementa como funtores de objetos. Según cómo funcionen, puede ser un requisito a priori.

13

Se puede utilizar para este std::function:

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

O ir completamente genérica:

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

Esto funciona en 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

esto no parece funcionar ... la salida que recibo es hola _ – subzero

0

Mientras el lambda no lo hace use capture clause (es decir, no captura las variables desde arriba), puede usarse como un puntero a la función. El compilador de VC genera internamente funciones anónimas con diferentes convenciones de llamadas para que pueda usarse sin problemas.

Cuestiones relacionadas