可以将 lambda 定义为类成员吗?
例如,是否可以使用 lambda 而不是函数对象来重写下面的代码示例?
struct Foo {
std::function<void()> bar;
};
我想知道的原因是因为以下 lambda 可以作为参数传递:
template<typename Lambda>
void call_lambda(Lambda lambda) // what is the exact type here?
{
lambda();
}
int test_foo() {
call_lambda([]() { std::cout << "lambda calling" << std::endl; });
}
我想如果 lambda 可以作为函数参数传递,那么也许它们也可以存储为成员变量。
经过更多的修补后,我发现这有效(但它有点毫无意义):
auto say_hello = [](){ std::cout << "Hello"; };
struct Foo {
typedef decltype(say_hello) Bar;
Bar bar;
Foo() : bar(say_hello) {}
};
原文由 StackedCrooked 发布,翻译遵循 CC BY-SA 4.0 许可协议
模板可以在没有类型擦除的情况下实现,但就是这样:
重复每个人已经公开的参数:
[]{}
不是一种类型,所以你不能像你正在尝试的那样将它用作例如模板参数。使用decltype
也是不确定的,因为 lambda 表达式的每个实例都是具有唯一类型的单独闭包对象的表示法。 (例如上面的f
的类型 不是foo<decltype([] { return 42; })>
。)