Est-il possible de déterminer le type de paramètre et le type de retour d'une lambda?

Donné un lambda, est-il possible de figure, c'est le type de paramètre et le type de retour? Si oui, comment?

Fondamentalement, je veux lambda_traits qui peut être utilisé dans une 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, c'est que je veux utiliser lambda_traits dans un modèle de fonction qui accepte un lambda comme argument, et j'ai besoin de savoir c'est le type de paramètre et le type de retour à l'intérieur de 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.

D'abord, 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 il n'aurait évidemment donner d'erreur. Donc je l'ai changé pour TLambda version de la fonction de modèle et souhaitez construire la std::function objet à l'intérieur de la fonction (voir ci-dessus).

  • Si vous connaissez le type de paramètre alors this peut être utilisé pour déterminer le type de retour. Je ne sais pas comment faire pour déterminer le type de paramètre que.
  • Il est supposé que la fonction prend un seul argument ?
  • "type de paramètre" Mais arbitraire en fonction lambda n'a pas un type de paramètre. Il peut prendre n'importe quel nombre de paramètres. De sorte que toute classe de traits devraient être conçues pour les paramètres de la requête par la position des indices.
  • Oui. pour le moment, nous pouvons supposer que.
  • Pour le moment, nous pouvons supposer que le lambda prend exactement un argument.
  • "La motivation, c'est que je veux utiliser lambda_traits dans un modèle de fonction qui accepte un lambda comme argument" Pourquoi voudriez-vous qu'il n'accepte qu'un lambda? Ne serait-il pas plus logique de simplement utiliser un std::function? Voulez-vous vraiment à forcer l'utilisateur à ne jamais appeler ce avec en particulier une lambda foncteur?
  • Parce que std::function ne semble pas fonctionner: ideone.com/E1Iqf

InformationsquelleAutor Nawaz | 2011-10-30