Как я могу сохранить лямбда-выражение как поле класса в C ++ 11?

Я хотел бы создать класс, в котором клиент может хранить лямбда-выражение вроде [] () -> void {} в качестве поля класса, но Я не могу понять, как это сделать. В одном из ответов предлагалось использовать decltype , что я безуспешно пробовал. Вот ссылка на источник идеона . Ниже приведены источник и результат:

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

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

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

Результат:

prog.cpp: In constructor 'MyClass::MyClass()':
prog.cpp:3:79: error: no matching function for call to '::__lambda0()'
prog.cpp:2:20: note: candidates are: ::(const&)
prog.cpp:2:20: note:                 ::(&&)
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()::)'
prog.cpp:3:48: note: candidates are: MyClass::MyClass()
prog.cpp:3:14: note:                 MyClass::MyClass(const MyClass&)

Кто-нибудь знает, как это сделать?

46
задан Community 23 May 2017 в 12:17
поделиться