Étant donné un lambda, est-il possible de déterminer son type de paramètre et son type de retour? Si oui, comment?
Fondamentalement, je veux lambda_traits
ce qui peut être utilisé des manières suivantes:
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 motivation derrière est que je veux utiliser lambda_traits
dans un modèle de fonction qui accepte un lambda comme argument, et j'ai besoin de connaître son type de paramètre et son type de retour dans la fonction:
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!
//...
}
Pour le moment, nous pouvons supposer que le lambda prend exactement un argument.
Au départ, j'ai essayé de travailler avec std::function
comme:
template<typename T>
A<T> f(std::function<bool(T)> fun)
{
return A<T>(fun);
}
f([](int){return true;}); //error
Mais cela donnerait évidemment une erreur. Je l'ai donc changé en TLambda
version du modèle de fonction et je souhaite construire l' std::function
objet à l'intérieur de la fonction (comme indiqué ci-dessus).