2010-11-05 20 views
5

¿Cómo es posible acceder a los tipos de parámetros de una función lambda en C++? El siguiente no funciona:¿Cómo puedo acceder a los tipos de lambda en C++ 0x?

template <class T> struct capture_lambda { 
}; 

template <class R, class T> struct capture_lambda<R(T)> { 
    static void exec() { 
    } 
}; 

template <class T> void test(T t) { 
    capture_lambda<T>::exec(); 
} 

int main() { 
    test([](int i)->int{ return 0; }); 
} 

Lo anterior no se compila, porque el compilador elige el prototipo de plantilla en lugar de la especialización.

¿Hay alguna manera de hacer lo anterior?

Lo que en realidad estoy tratando de lograr es esto: tengo una lista de funciones y quiero seleccionar la función apropiada para invocar. Ejemplo:

template <class T, class ...F> void exec(T t, F... f...) { 
    //select the appropriate function from 'F' to invoke, based on match with T. 
} 

Por ejemplo, quiero invocar la función que toma 'int':

exec(1, [](char c){ printf("Error"); }, [](int i){ printf("Ok"); }); 
+1

Voy a pedir una vista un poco más amplia: ¿Qué problema estás tratando de resolver con la función 'exec'? Suena un poco feo – GManNickG

+0

Estoy tratando de hacer un tipo de unión algebraica. – axilmar

+0

Resolución de sobrecarga en tipos de objetos de funciones arbitrarias ... No se me ocurre una manera de hacerlo. Si exportarían sus tipos de param, se puede hacer. De lo contrario, no tengo idea. –

Respuesta

2

Esto no es posible, las funciones lambda son azúcar sintáctica para la creación de la función no se opone funciones reales. Esto significa que la plantilla acepta una clase y las clases no tienen el concepto tipo de argumento.

También tenga en cuenta que un objeto de función general puede tener cualquier número de operator() s sobrecargado.

Cuestiones relacionadas