有没有一种方法可以在编译时获得作用域类名

Is there a way to get the scope class name at compile time?

本文关键字:编译 作用域 一种 方法 有没有      更新时间:2023-10-16

我正试图发布一种技术,作为开源库,我在项目中经常使用这种技术。一种在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

问题是这个解决方案太冗长了,我不喜欢。我希望我可以省去一些冗长的工作,从包装器声明和初始化中删除类名,从上下文中获取名称。为了做到这一点,我需要一种在编译时检索当前作用域类名的方法。有什么办法吗?

您的问题似乎主要是由于宏的问题。它们是由预处理器处理的,这有点继承自C。它不是范围感知周期。

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