将编译时 C 回调转换为编译时 C++ 回调

问题描述

我正在为嵌入式设备 (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);

知道函数认是externed,这只是一个标记,表明模块不是负责实现它们的人。 这种方法的主要优点是未实现的回调会在编译时被链接器捕获。

在过渡到 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 (将#修改为@)