Dada una lambda, ¿es posible descubrir su tipo de parámetro y el tipo de retorno? Si es así, ¿cómo?
Básicamente, quiero lambda_traits
que se pueda usar de las siguientes maneras:
auto lambda = [](int i) { return long(i*10); };
lambda_traits<decltype(lambda)>::param_type i; //i should be int
lambda_traits<decltype(lambda)>::return_type l; //l should be long
La motivación detrás es que quiero usar lambda_traits
una plantilla de función que acepte un lambda como argumento, y necesito saber su tipo de parámetro y el tipo de retorno dentro de la función:
template<typename TLambda>
void f(TLambda lambda)
{
typedef typename lambda_traits<TLambda>::param_type P;
typedef typename lambda_traits<TLambda>::return_type R;
std::function<R(P)> fun = lambda; //I want to do this!
//...
}
Por el momento, podemos suponer que la lambda toma exactamente un argumento.
Inicialmente, intenté trabajar std::function
como:
template<typename T>
A<T> f(std::function<bool(T)> fun)
{
return A<T>(fun);
}
f([](int){return true;}); //error
Pero obviamente daría error. Entonces lo cambié a la TLambda
versión de la plantilla de función y quiero construir el std::function
objeto dentro de la función (como se muestra arriba).