C 11 lambda 作为成员变量?

新手上路,请多包涵

可以将 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 许可协议

阅读 1.8k
2 个回答

模板可以在没有类型擦除的情况下实现,但就是这样:

 template<typename T>
struct foo {
    T t;
};

template<typename T>
foo<typename std::decay<T>::type>
make_foo(T&& t)
{
    return { std::forward<T>(t) };
}

// ...
auto f = make_foo([] { return 42; });

重复每个人已经公开的参数: []{} 不是一种类型,所以你不能像你正在尝试的那样将它用作例如模板参数。使用 decltype 也是不确定的,因为 lambda 表达式的每个实例都是具有唯一类型的单独闭包对象的表示法。 (例如上面的 f 的类型 不是 foo<decltype([] { return 42; })> 。)

原文由 Luc Danton 发布,翻译遵循 CC BY-SA 3.0 许可协议

“如果 lambda 可以作为函数参数传递,那么也可以作为成员变量”

第一个是肯定的,您可以使用模板参数推导或“自动”来这样做。第二个可能不是,因为您需要知道声明点的类型,并且前两个技巧都不能用于此。

一种可能有效但我不知道是否有效的方法是使用 decltype。

原文由 dascandy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题