好的,我正在编写一个简单的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表达式的引用的东西 - 我是金色的。
答案 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);
}