【发布时间】:2017-12-01 18:53:22
【问题描述】:
我实际上是想拥有它,这样我就可以从任何带有捕获的 Lamba 创建一个通用回调:GenericCallback([=]{});
使用以下类:
template<typename T> class GenericCallback : public Callback {
public:
GenericCallback(const std::function<T>& f) {
mFunction = f;
}
void Call() override {
mFunction();
}
std::function<T> mFunction;
};
问题是它希望我定义模板参数。通常这样做没有问题,但如果我使用任何捕获,无论是使用 [=] 还是特定参数,我都无法将类型推入此结构中。
我的最终目标是稍后在指定条件下简单地调用这些函数。
出现此错误的情况:
int v = 5;
GenericCallback<void()>([=]{ int x = v; });
【问题讨论】:
-
你能提供一个具体的例子吗?我有一个想法,但不确定在这种情况下是否可行。
-
@Incomputable
GenericCallback([=]{}); -
“我无法将类型塞进这个结构中。” 怎么会这样?
GenericCallback<void()>{[=]{}}工作正常。 -
@MikeWeir,您似乎正在寻找类型擦除。您的班级无法做到这一点。事实上,它与
std::function具有相同或更少的功能。 -
@MikeWeir,
std::function可以存储与其给出的签名兼容的任何可调用对象,因此std::function<void()> a([some_int]{ return some_int; });完全有效。因此,您可以只拥有一个std::function<void()>数组并存储任何不带参数的可调用对象。
标签: c++ templates lambda std-function