问题描述
我正在为嵌入式设备 (ESP32) 将 C 代码库转换为 C++。在当前代码中重复的一件事是一种向 C 模块声明“回调”并在“用户”模块中实现它们的方法。
例如,Button 模块的当前 API 如下:
void btn_init(uint32_t gpio);
// callbacks
extern bool btn_on_change_isr(bool is_pressed,uint32_t timer_duration_s);
extern bool btn_on_timer_isr(uint32_t duration_s);
知道函数默认是extern
ed,这只是一个标记,表明模块不是负责实现它们的人。
这种方法的主要优点是未实现的回调会在编译时被链接器捕获。
在过渡到 C++ 时,我想保持编译时检查是否存在回调实现(我不需要动态调度),但也允许创建多个对象,所以我需要类。
虽然我是 CRTP 和基于策略的设计的新手,但我想我应该选择其中之一。或者模板函子?这两者有什么区别?
我目前的想法如下:
template <typename Impl>
class Button
{
public:
Button(uint32_t gpio,Impl impl_ = Impl())
: impl(impl_)
{
(void)gpio;
}
bool on_change_isr(bool is_pressed,uint32_t timer_duration_s)
{
return impl.on_change_isr(is_pressed,timer_duration_s);
}
bool on_timer_isr(uint32_t duration_s)
{
return impl.on_timer_isr(duration_s);
}
private:
Impl impl;
};
实现代码在哪里:
class MyButton
{
public:
bool on_change_isr(bool is_pressed,uint32_t timer_duration_s)
{
// implementation
}
bool on_timer_isr(uint32_t duration_s)
{
// implementation
}
};
在这里困扰我的一个主要问题是我仍然希望将实现保留在 cpp
文件中,而不是标题中。对于 Button
类,我想在 cpp
文件中实现构造函数。我怎样才能做到这一点?
总的来说,这有意义吗?有没有更好的方法可以在不使用继承的情况下注入回调?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)