【问题标题】:Build a compile time command look up table using template metaprogramming使用模板元编程构建编译时命令查找表
【发布时间】:2019-10-31 07:31:14
【问题描述】:

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

struct cmdparse{
    char* commandname;
    function_pointer;
};

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

【问题讨论】:

  • 仅当模块的注册也将在编译时发生
  • 是的,每个模块在编译时都会知道命令名和对应的回调。

标签: c++ template-meta-programming


【解决方案1】:

如果你有不错的编译器(至少启用),你可以在编译时构建:

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

void whatever1();
void whatever2();

constexpr cmdparse commands[] = {//<--compiler time
  cmdparse{"cmd1", &whatever1}, 
  cmdparse{"cmd2", &whatever2}
};

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


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

std::array<cmdparse, 1024> dyn_commands; //<-- supports up to 1024 commands

【讨论】:

  • 这是我现有的设计,我试图找到一个替代方案。我的编译器可以支持 C++14。
  • @Sivaram 这个设计有什么问题?编译时纯动态的东西和固定大小不能很好地融合在一起
  • 1) 如果我在项目中添加新/删除模块,则需要在两个地方进行更改,对应的模块以及定义它的表。 2)我不能使用静态函数作为回调,我试图使命令解析器更通用,这不应该有任何命令或函数的想法,现在应该是迭代一个表(这是构建在编译时),如果找到匹配项调用函数 ptr.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
相关资源
最近更新 更多