使用模板元编程建立一个编译时命令查找表

Siv*_*ram 3 c++ template-meta-programming

我正在尝试为嵌入式系统(裸机)构建命令解析器,它将通过消息接收命令并调用相应的函数。结构看起来像

struct cmdparse{
    char* commandname;
    function_pointer;
};
Run Code Online (Sandbox Code Playgroud)

最初,各个模块将注册它们将服务的命令和相应的功能指针。命令解析器在初始化期间建立查找表。每当收到命令时,它都会解析表并调用相应的函数,是否有可能实现此目标,即使用模板元编程在编译时构建此查找表。我期望的主要优点是,无论何时添加新命令,都无需检查命令解析器即可查看是否需要增加数组大小。由于它是嵌入式系统,因此由于动态内存需求,禁止使用vector。另外,如果此查找表转到ROM而不是RAM,它将添加一个安全条款,以避免意外损坏。

dar*_*une 5

如果您有不错的编译器(至少启用),则可以在编译时使用以下命令进行构建:

struct cmdparse{
    const char* commandname;
    void (*fn)();
};

void whatever1();
void whatever2();

constexpr cmdparse commands[] = {//<--compiler time
  cmdparse{"cmd1", &whatever1}, 
  cmdparse{"cmd2", &whatever2}
};
Run Code Online (Sandbox Code Playgroud)

如果您没有好的编译器,则可能需要删除否则此方法应该可以工作。


在运行时为更多命令腾出空间最好在单独的数组中完成:

std::array<cmdparse, 1024> dyn_commands; //<-- supports up to 1024 commands
Run Code Online (Sandbox Code Playgroud)