C ++在对象中保留Lambda表达式

时间:2016-03-17 01:17:33

标签: c++ lambda

好的,我正在编写一个简单的GUI框架。我偶然发现了lambda表达式并认为它们是回调的好方法。但我无法弄清楚如何在类中保留表达式(下面非常简化的示例代码)。

class class1
{
public:
  class1(auto callback);
private:
  const auto mCallback  
};
class1::class1(auto callback) : mCallback(callback)
{

}
int main()
{
    auto thiscode = [] (int id) 
    {
        std::cout<<"callback from..." << id << std::endl;
    };
    class1 c1 = class1(thiscode);
}

我最终得到了这个错误,

  

错误:非静态数据成员声明为'auto'

我认为这是有道理的,它无法确定运行时的大小。事实上,在C ++ 14之下,它甚至不允许我将auto callback作为参数传递给构造函数。 (我认为这在概念的准备过程中发生了变化?)。

我如何解决这个问题?我不介意做一些奇怪的事情,任何允许我保留对传递的lambda表达式的引用的东西 - 我是金色的。

2 个答案:

答案 0 :(得分:4)

您可以使用std :: function来存储thiscode

这样的事情:

#include <functional>
#include <iostream>

class class1 {
public:
    class1(std::function<void(int)> callback) : mCallback{callback} {};
    void do_callback() { mCallback(3); };
private:
    const std::function<void(int)> mCallback;
};

int main()
{
    auto thiscode = [](int id) {
        std::cout<<"callback from..." << id << std::endl;
    };
    class1 c1 = class1(thiscode);
    c1.do_callback();
    return 0;
}

请参阅live demo here

答案 1 :(得分:3)

您可以使用模板

来保存它们
template<typename T>
class class1
{
public:
    class1(T callback): mCallback{std::move(callback)} {}
private:
    const T mCallback  
};

template<typename T>
auto makeClass1(T&& callback) {
    return class1<std::decay_t<T>>{std::forward<T>(callback)};
}

int main()
{
    auto thiscode = [] (int id) 
    {
        std::cout<<"callback from..." << id << std::endl;
    };
    auto c1 = makeClass1(thiscode);
}

或者,您可以使用std::function

来保留它们
class class1
{
public:
  class1(std::function<void(int)> callback);
private:
  const std::function<void(int)> mCallback  
};

int main()
{
    auto thiscode = [] (int id) 
    {
        std::cout<<"callback from..." << id << std::endl;
    };
    class1 c1 = class1(thiscode);
}