c++ - 如何将标准例程添加到函数指针数组中的每个函数?
问题描述
我正在用 C++ 为嵌入式系统创建一个应用程序。因此我依赖于一些 C 库,并且没有使用大量 std 功能的自由。
我有一个回调签名:
typedef int (*callback_fn)(int a, int b);
带有指向已注册回调的指针的列表:
callback_fn my_callback_functions[10];
还有一个将回调添加到此列表的函数:
void add_callback(int function_iterator, callback_fn fn)
{
my_callback_functions[function_iterator] = fn;
}
回调然后被传递给这个库,它在某些事件上调用回调。
现在我想为每个回调添加一个小程序,这样我可以在每次调用时重置一个计时器:
myTimer.reset();
如何在不更改签名或远离函数指针(我需要与库交互)的情况下将其添加到每个调用中?
我用模板尝试了一些东西,但找不到正确的方法来完成这项工作。
解决方案
定义一个包含静态函数的结构。这将是您的回调之一。结构的名称无关紧要,只是函数本身的名称必须是常量。例如:
struct MyCallback1 {
static int callback(int a, int b) {
//..
}
};
现在我们可以编写我们的包装器了:
template<typename T>
int decorated_callback(int a, int b) {
myTimer.reset();
return T::callback(a, b);
}
并将其注册为回调:
add_callback(0, &decorated_callback<MyCallback1>);
推荐阅读
- javascript - Github 为 R 用户提供的 JavaScript 安全警报
- reactjs - 我很难启动或运行一个简单的 React JS
- common-lisp - 为什么运球会产生一个空文件?
- postgresql - Hasura 2.0,有没有办法使用通配符?
- discord.js - DISCORD.JS 如何使用@user 进行验证
- javascript - 根据条件使用 axios 和 promise 组合 2 个 json 数据集
- vue.js - ./resources/js/components/versionView.vue?vue&type=template&id=5700cc22 中的警告
- raspberry-pi - 如何将视频源帧发送到 ThingsBoard 小部件,而不从本地服务器请求它们?
- next.js - NextJS getInitialProps 返回 404 而不是使用 res.writeHead(302) 重定向
- c++ - 如何在 DLL 中使用 SetWindowsHookEx 和 WH_GETMESSAGE 来获取全局消息?使用 WH_GETMESSAGE 没有看到任何消息