Comment puis-je stocker une expression lambda comme un champ d'une classe en C++11?

Je voudrais créer une classe où le client peut stocker une expression lambda comme []() -> void {} comme un champ de la classe, mais je ne peux pas comprendre comment le faire. Une réponse a suggéré d'utiliser decltype, que j'ai essayé, sans succès. Voici une ideone lien source. Ci-dessous est la source et le résultat:

#include <cstdio>
auto voidLambda = []()->void{};

class MyClass {
public:
     decltype(voidLambda) t;
     MyClass(decltype(voidLambda) t) { 
        this->t = t;
     }
};

int main() {
   MyClass([] {
      printf("hi");
   });
}

Résultat:

prog.cpp: In constructor 'MyClass::MyClass(<lambda()>)':
prog.cpp:3:79: error: no matching function for call to '<lambda()>::__lambda0()'
prog.cpp:2:20: note: candidates are: <lambda()>::<lambda>(const<lambda()>&)
prog.cpp:2:20: note:                 <lambda()>::<lambda>(<lambda()>&&)
prog.cpp:3:88: error: no match for 'operator=' in '((MyClass*)this)->MyClass::t = t'
prog.cpp: In function 'int main()':
prog.cpp:5:27: error: no matching function for call to 'MyClass::MyClass(main()::<lambda()>)'
prog.cpp:3:48: note: candidates are: MyClass::MyClass(<lambda()>)
prog.cpp:3:14: note:                 MyClass::MyClass(const MyClass&)

Personne ne sait comment faire cela?

  • Chaque expression lambda crée son propre type unique. Dans auto A = [](){}; auto B = [](){}; A et B ne sont pas du même type.
  • Malheureusement struct A { auto x = 0; }; n'est pas autorisé.
InformationsquelleAutor | 2012-02-08