c++ - 有没有办法在编译时获取作用域类名?

标签 c++ arduino

我正在尝试将我在项目中经常使用的一项技术作为开源库发布。一种在Arduino项目中快速生成状态机的方法。

您为状态机创建一个类,该类继承自 StateMachine 父类(super class)。然后,将状态函数包装在主循环内调用的 State 对象周围,每个状态最后都会通知下一个状态。这很难解释,但很容易显现出来。

#include "StateMachine.h"

class Blink : public StateMachine{
  private:
    int port;
    int waitTime;
    CREATE_STATE(Blink, low);
    CREATE_STATE(Blink, high);
    void low() {
      digitalWrite(port, LOW);
      *this << &STATE(high) + waitTime;
    }
    void high() {
      digitalWrite(port, HIGH);
      *this << &STATE(low) + waitTime;
    }
  public:
    Blink(int port, int waitTime) :
      StateMachine(&STATE(low)),
      port(port),
      waitTime(waitTime),
      INIT_STATE(Blink, low),
      INIT_STATE(Blink, high)
      {
        pinMode(port, OUTPUT);
      }
};

Blink led1(13, 1000);
Blink led2(14, 2000);
Blink led3(15, 3000);

void setup() {}

void loop() {
  led1();
  led2();
  led3();
}

最复杂的部分被抽象在宏 CREATE_STATE()、STATE 和 INIT_STATE 内。

CREATE_STATE 为状态函数创建一个包装器。 INIT_STATE 运行包装构造函数。 STATE 对代码内包装器的引用。

它们看起来像这样:

#define CREATE_STATE(statemachine, state) State<statemachine> state_##state
#define INIT_STATE(statemachine, state) state_##state(this, &statemachine::state)
#define STATE(state) state_##state

问题是这个解决方案对于我来说太冗长了。我希望我可以减少一些冗长的内容,从包装器声明和启动中删除类名,从上下文中获取名称。为此,我需要一种在编译时检索当前作用域类名的方法。有什么办法可以做到吗?

最佳答案

看来您的问题主要是由于宏引起的。它们由预处理器处理,这有点继承自 C。它不是作用域感知的 - 期间。

相反,请查看网络上的各种 C++ 状态机实现。他们通常使用模板。模板由 C++ 编译器本身处理。这使他们更加强大。他们了解语法、作用域、重载、高级数学(包括递归函数)等。

关于c++ - 有没有办法在编译时获取作用域类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53121080/

相关文章:

c++ - 如何修复 "' Function' does not name a type "? [Arduino]

c++ - 两个 Sprite 列表的碰撞 - SFML 2.0

c++ - 如何为模板化运算符指定模板参数

c - 多定时器Arduino

c++ - 没有 IDE 的 Arduino DUE 编程 (Linux)

c - Arduino 应有的 HTTPS 支持

linux - Arduino 无法从串口读取

c++ - SDL:两个事件循环?

c++ - QThreadPool 上的 QSqlDatabase 池

c++ - 为什么 gmtime 和 localtime 给我相同的结果?