gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 14:00:27 25 4
gpt4 key购买 nike

我想创建一个类,客户端可以在其中存储像 []() -> void {} 这样的 lambda 表达式作为类的字段,但我不知道怎么做。 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<>包装器类型(来自 <functional> header ),它可以保存任何可调用函数。例如:

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

这样,您不需要知道 lambda 表达式的类型。您可以只存储 std::function<>适当的函数类型,模板系统将为您处理所有类型。更一般地,任何适当签名的可调用实体都可以分配给std::function<>。 ,即使该仿函数的实际类型是匿名的(在 lambda 的情况下)或非常复杂。

std::function 中的类型模板应该是与您要存储的函数相对应的函数类型。因此,例如,存储一个接收两个 int 的函数。 s 并返回 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([] {
printf("hi")
}) mc; // Should be just fine.
}

希望这会有所帮助!

关于c++ - 如何在 C++11 中将 lambda 表达式存储为类的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com