将回调函数打包到模板化类中
Packing a callback function into a templated class
我正在尝试创建一个回调函数结构,我可以放置一个泛型函数及其将接收的所有参数,以便在执行过程中的任何时候都可以调用它。
对我来说,它看起来像这样:
template <typename T, typename... targs>
class CallbackFunction {
private:
targs... args;
std::function<T(targs...)> fun;
public:
CallbackFunction(std::function<T(targs...)> fun, targs... args) : fun(fun), args(args) {}
T call () {
return this->fun(this->args);
}
};
这样我就可以做这样的事情:
CallbackFunction cb = CallbackFunction(printf, "Hello World!n");
cb.call();
我知道这样做有两个问题:
1-你不能存储塔格...参数。编译器说data member type contains unexpanded parameter pack 'targs'
2-您不能按原样将参数发送到函数。你需要以某种方式解开它。编译器说expression contains unexpanded parameter pack 'args'
做这样的事情的正确方法是什么?
template<class T>
using CallbackFunction=std::function<T()>;
CallbackFunction<void> cb = []{printf("Hello World!n");};
cb();
类型T
必须是该类型的一部分,因此除 C++17 外,您必须至少列出它。
targs...
只是一个内部细节。std::function
确实在签名上键入擦除,并且可以处理存储任何一组targs...
或其他状态。
一个可以调用并返回T
并存储某种状态的对象是一个std::function<T()>
。 其余的都是渣滓。
如果你真的必须
template <typename T>
class CallbackFunction {
std::function<T()> fun;
public:
template<class...targs>
CallbackFunction(std::function<T(targs...)> fun, targs... args) : fun([=]{ return fun(args...); }){}
T call() const {
return fun();
}
};
使用移动语义优化这一点需要做更多的工作。 查找std::apply
的实现:
template<class...targs>
CallbackFunction(std::function<T(targs...)> fun, targs... args) : fun(
[fun=std::move(fun), args=std::make_tuple(std::move(args)...)]()->decltype(auto){
return std::apply(fun,args);
}
){}
相关文章:
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- C 回调函数在对象 pascal 上崩溃
- 类 Referention 中C++回调函数引用非静态函数
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 动态链接库中C++回调函数
- 我想制作设置鼠标回调函数,以便在仍然按下鼠标左键时连续传递坐标
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 我可以使用谷歌 v8 在回调函数中获取 JavaScript 函数C++源文本吗?
- 重写另一个方法 [C++] 使用的超类回调函数
- 是否可以影响 C++ 中回调函数的局部变量?
- C++ Qt5 中带有 pigpio 库的回调函数
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- C++在赋值或回调函数时重载模板
- 如何用不同的参数类型和数字回调函数
- 如何为Python Swigged C++对象创建和分配回调函数
- 用回调函数替换C++正则表达式
- C++带有回调函数的模板类