首页 > 解决方案 > 如何将标准例程添加到函数指针数组中的每个函数?

问题描述

我正在用 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();

如何在不更改签名或远离函数指针(我需要与库交互)的情况下将其添加到每个调用中?

我用模板尝试了一些东西,但找不到正确的方法来完成这项工作。

标签: c++arraystemplatesfunction-pointers

解决方案


定义一个包含静态函数的结构。这将是您的回调之一。结构的名称无关紧要,只是函数本身的名称必须是常量。例如:

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>);

推荐阅读