Tôi muốn tạo một lớp mà khách hàng có thể lưu trữ một biểu thức lambda như []() -> void {}
dưới dạng một trường của lớp, nhưng tôi không thể tìm ra cách làm như vậy. One answer suggested using decltype
, mà tôi đã thử không thành công. Đây là ideone source link. Dưới đây là nguồn gốc và kết quả:Làm cách nào để lưu trữ một biểu thức lambda dưới dạng một trường của một lớp trong C++ 11?
#include <cstdio>
auto voidLambda = []()->void{};
class MyClass {
public:
decltype(voidLambda) t;
MyClass(decltype(voidLambda) t) {
this->t = t;
}
};
int main() {
MyClass([] {
printf("hi");
});
}
Kết quả:
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&)
Có ai biết làm thế nào để làm điều này?
Mỗi lambda tạo ra nó là loại độc đáo riêng. Trong 'auto A = []() {}; auto B = []() {}; '' A' và 'B' không cùng loại. – bames53
Thật không may 'struct A {auto x = 0; }; 'không được phép. –