【问题标题】:Is there a way to get the scope class name at compile time? [duplicate]有没有办法在编译时获取作用域类名? [复制]
【发布时间】:2018-11-02 15:05:16
【问题描述】:

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

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

#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 运行包装器构造函数。 代码中对包装器的状态引用。

它们看起来像这样:

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

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

【问题讨论】:

  • @RaymondChen 感谢您的提醒...但我想答案就在这个问题中...stackoverflow.com/questions/21143835/…
  • 干得好!
  • 我想我会把问题留在这里,因为这两个概念(获取类名和实现一个自我成员)之间的相关性并不明显,它可能会帮助其他有同样问题的人.
  • @RaymondChen 我从那里链接的问题中得到了答案...您可以编辑以更改您的复制链接吗?
  • 很遗憾我不能。希望这里的 cmets 能给人们带来更好的答案。

标签: c++ arduino


【解决方案1】:

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

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

【讨论】:

  • 抱歉,这不是答案。这是一个冗长的评论。
  • @SergeyA:认真点。我解释了宏不可能,为什么不可能,然后我提供了一个替代方案。这是一个很好的答案。
猜你喜欢
  • 2021-11-07
  • 2011-07-04
  • 2011-09-02
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
相关资源
最近更新 更多