将 lambda 推导为 std::function<T>
Deducing lambdas to std::function<T>
我本质上是在尝试拥有它,以便我可以从任何带有捕获的 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; });
你误解了std::function<>
的整个概念,把问题搞得太复杂了。在这种情况下,您可以使用std::function<void()>
并将漂亮的匹配内容绑定到它,只有在需要更改呼叫签名时才需要在<>
中更改类型。所以
class Callback {
public:
using callback_type = std::function<void()>;
Callback( callback_type cb ) : m_cb( cb ) {}
void call() { m_cb(); }
private:
callback_type m_cb;
};
int main()
{
int v;
Callback c( [=]{ int x = v; } );
c.call();
}
将简单工作,您不需要那里的模板。在这种情况下,只有当您希望Callback::call()
将某些内容传递给该回调或使其返回某些内容时才需要在std::function
中更改类型,我怀疑您打算这样做。
现场示例
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- <<操作员在下面的行中工作
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝