如何将lambda表达式存储为C 11中的类的字段?

我想创建一个类,客户端可以存储lambda表达式[]() – > void {}作为类的一个字段,但我不知道如何这样做。 One answer suggested using decltype,我试过没有成功。这里是一个ideone source link.下面是源和结果:

#include <cstdio>
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(<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&)

有谁知道如何做到这一点?

如果你想要一个类成员作为一个lambda表达式,考虑使用std :: function<>包装器类型,它可以保存任何可调用的函数。例如:

std::function<int()> myFunction = []() { return 0; }
myFunction(); // Returns 0;

这样,您不需要知道lambda表达式的类型。你可以只存储一个std :: function<>的适当的函数类型,模板系统将处理所有类型为你。更一般地,即使该函子的实际类型是匿名的(在lambdas的情况下)或者真的复杂,也可以将适当签名的任何可调用实体分配给std :: function<&gt ;. std :: function模板中的类型应该是与您要存储的函数对应的函数类型。因此,例如,要存储一个接受两个int并返回void的函数,你可以使用一个std :: function< void(int,int)>。对于没有参数并返回int的函数,你可以使用std :: function< int()>。在你的情况下,因为你想要一个没有参数并返回void的函数,你会想要这样:

class MyClass { 
public:
    std::function<void()> function;
    MyClass(std::function<void()> f) : function(f) {
        // Handled in initializer list
    }
};

int main() {
    MyClass([]() -> void {
        printf("hi")
    }) mc; // Should be just fine.
}

希望这可以帮助!

http://stackoverflow.com/questions/9186510/how-can-i-store-a-lambda-expression-as-a-field-of-a-class-in-c11

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何将lambda表达式存储为C 11中的类的字段?