我正在制作一个系统,用于注册来自硬件设备的回调并将它们翻译成 c++。c 文件中有一个松散耦合的库函数,当某些硬件事件发生时会调用该函数。我在我的文件中重新定义它,并将调用重定向到某个类的方法。
也就是说,有一个被调用的函数(Callable
),以及该函数所属的类的一个对象(Object
)。这两个实体必须以某种方式存储,以便以后可以调用它们。
使用std::function
和类似类型的变体不适合,因为它们在堆上分配内存。这就是我所做的:
template<class Callable, class Object>
struct Callback {
Callback(Callable f, Object o) :
func(f),
object(o)
{}
Callable func;
Object object;
};
class CallbackRegistry {
public:
template<class Callable, class Object>
static void setCallback(Object object, Callable func)
{
Callback1<Callable, Object> = Callback<Callable, Object>(func, object);
}
//Здесь надо хранить объект this и функцию. Возможно, надо уйти от шаблонности.
template<class Callable, class Object>
static Callback<Callable, Object> Callback1;
};
template<class Callable, class Object>
Callback<Callable, Object> CallbackRegistry::Callback1 = Callback<Callable, Object>(nullptr, nullptr);
//Эта функция вызывается аппаратно. В библиотечном файле она объявлена со слабым связыванием.
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
//Как определить эти типы? Если уходить от шаблонности переменной Callback1, то их здесь не будет
std::invoke(CallbackRegistry::Callback1<?, ?>.func,
CallbackRegistry::Callback1<?, ?>.object /* this */);
}
CallbackRegistry::setCallback(someObject, comeMethodOfObject);
问题是,为了实现所需的行为,您需要以某种方式摆脱Callback1
. 在某个地方单独存储类型?但是如何- 我还是不明白。
存储特定类型的回调数据,而不是模板数据。您可以为此选择一个特殊的接口。