有没有一种方法可以在编译时获得作用域类名
Is there a way to get the scope class name at compile time?
我正试图发布一种技术,作为开源库,我在项目中经常使用这种技术。一种在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++编译器本身处理。这使他们更加强大。他们了解语法、作用域、重载、高级数学(包括递归函数(等。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 在编译时选择全局作用域函数
- 为什么要编译无作用域枚举的声明?
- 具有作用域枚举的位集无法编译
- 编译g++时不在作用域内声明
- 模板作用域问题代码无法编译
- 在类作用域内定义方法时,除非在原始 cpp 文件中的其他位置调用方法,否则项目不会编译
- 在Visual Studio 2012中,作用域操作符中的错别字会导致意外的编译和递归
- 在子作用域中重新声明变量不会导致编译错误
- c++在编译时文件作用域对整个程序是全局的吗?
- 和使用声明作用域相同的类声明在GCC中编译,但不在MSVS中编译