我正在尝试为嵌入式系统(裸机)构建命令解析器,它将通过消息接收命令并调用相应的函数。结构看起来像
struct cmdparse{
char* commandname;
function_pointer;
};
最初,各个模块将注册它们将要服务的命令和相应的功能指针。命令解析器在初始化期间建立查找表。每当收到命令时,它都会解析表并调用相应的函数,是否有可能实现此目标,即使用模板元编程在编译时构建此查找表。我期望的主要优点是,无论何时添加新命令,都无需检查命令解析器即可查看是否需要增加数组大小。由于它是嵌入式系统,因此由于动态内存需求,禁止使用vector。另外,如果此查找表转到ROM而不是RAM,它将添加一个安全条款,以避免意外损坏。
最佳答案
如果您有不错的编译器(至少启用c++11),则可以在编译时生成,方法是:
struct cmdparse{
const char* commandname;
void (*fn)();
};
void whatever1();
void whatever2();
constexpr cmdparse commands[] = {//<--compiler time
cmdparse{"cmd1", &whatever1},
cmdparse{"cmd2", &whatever2}
};
如果您没有好的编译器,则可能需要删除constexpr-否则此方法应该可以工作。
在运行时为更多命令腾出空间最好在单独的数组中完成:
std::array<cmdparse, 1024> dyn_commands; //<-- supports up to 1024 commands