我经常需要实现一个能够根据用户命令切换其行为的对象.例如,这可能是连接到PC并由用户通过GUI控制的类代表设备的情况.更一般地说,设备必须独立存在,具有自己的操作调度.
由于我想从特定的设备类中"提取"这种行为以增强代码重用,这里我提出了一个使用Qt的模板化有限状态机类.我还报告了A类中的一个示例用法.你(比我更有经验的程序员:)怎么想?这是设计这样一个班级的"正确"方式吗?有性能问题吗?
template < class Base,
typename T,
class ThreadPolicy>
class FSM
{
public:
typedef bool (Base::*my_func)();
struct SState {
SState(){}
SState(const T& id_arg,
const T& next_arg,
const T& error_arg,
const QList<T>& branches_arg,
const my_func& op_arg) :
id(id_arg),
next(next_arg),
error(error_arg),
branches(branches_arg),
op(op_arg)
{}
T id; // state ID
T next; // next state
T error; // in case of error
QList<T> branches; // allowed state switching from current
my_func op; // operation associated with current state
};
typedef QMap<T ,SState> …Run Code Online (Sandbox Code Playgroud) 我想知道Qt是否提供了typeid的替代方法来识别变量类型并以人类可读的格式获取它们的名称.我的具体问题如下:
struct gArgument{
QString type;
void* arg;
};
void gargConverter(gArgument* oArg, T data){
oArg->type = typeid(data).name();
oArg->arg = static_cast<void*> (&data);
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是概括一个变量以用作函数的输入.作为一个侧节点tyeinfo似乎在我的系统上没有正常工作(我在Windows 7上使用MinGW),如果我尝试:
int i; std::cout << typeid(i).name() << std::endl;
QString s; std::cout << typeid(s).name() << std::endl;
double d; std::cout << typeid(d).name() << std::endl;
float f; std::cout << typeid(f).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)
我明白了
i
7QString
d
f
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?