Создание таблицы поиска команд времени компиляции с использованием шаблонного метапрограммирования - PullRequest
3 голосов
/ 31 октября 2019

Я пытаюсь создать анализатор команд для встроенной системы (голое железо), где он будет получать команду через сообщение и вызывать соответствующую функцию. Структура будет выглядеть так:

struct cmdparse{
    char* commandname;
    function_pointer;
};

Первоначально соответствующие модули зарегистрируют команду, которую они будут обслуживать, и соответствующий указатель на функцию. Анализатор команд создает таблицу поиска во время инициализации. Когда команда принимается, она анализирует таблицу и вызывает соответствующую функцию. Возможно ли это сделать, т. е. построить эту справочную таблицу во время компиляции, используя шаблонное метапрограммирование. Главное преимущество, которое я ожидаю, это когда добавляется новая команда, мне не нужно проверять анализатор команд, чтобы увидеть, нужно ли увеличивать размер массива. Поскольку это встроенный системный проект, использование вектора запрещено из-за требований динамической памяти. Кроме того, если эта справочная таблица перейдет в ПЗУ, а не в ОЗУ, это добавит пункт о безопасности во избежание преднамеренного повреждения.

1 Ответ

5 голосов
/ 31 октября 2019

Если у вас есть приличный компилятор (включите хотя бы ), вы можете собрать в время компиляции с помощью:

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
...