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

时间:2018-11-02 15:05:17

标签: c++ arduino

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

您为状态机创建一个类,并且该类继承自StateMachine超类。然后,将状态函数包装在主循环内调用的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

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

1 个答案:

答案 0 :(得分:1)

看来您的问题主要归因于宏。它们由预处理器处理,whuich有点继承自C。它不是作用域识别的-period。

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