代码之家  ›  专栏  ›  技术社区  ›  Luiz Menezes

有没有办法在编译时获得作用域类名?[复制]

  •  2
  • Luiz Menezes  · 技术社区  · 6 年前

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

    为状态机创建一个类,该类继承自状态机超类。然后,围绕在主循环中调用的状态对象包装状态函数,每个状态在结束时通知下一个状态。这很难解释,但很容易出现。

    #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中。

    对代码中包装器的状态引用。

    #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 回复  |  直到 6 年前
        1
  •  1
  •   MSalters    6 年前

    看来你的问题主要是由于宏的问题。它们是由预处理器处理的,这有点继承自C语言。这不是范围感知-周期。