Из соображений производительности я использую шаблон шаблона Curiious Reoccuring , чтобы избежать виртуальных функций. У меня много маленьких команд, которые выполняются миллионы раз. Я пытаюсь вписать это в шаблон командования. Я хочу добавить тонны команд в очередь, а затем перебирать их, выполняя каждую по одной. Каждая команда использует CRTP, чтобы избежать виртуальных функций. Проблема, с которой я сталкиваюсь, состоит в том, что шаблон Command обычно реализуется с использованием вектора указателей. Но когда класс Command является шаблонным, становится трудно обойти общие указатели команд. Я не эксперт по C ++, так что, возможно, есть очевидный способ сохранить вектор шаблонных объектов команд? Я пытался использовать что-то вроде:
boost:ptr_vector commands;
AddCommand(Command* command) {
commands.push_back(command);
}
Проблема Command
не в типе, поэтому Command* command
выдает ошибку компиляции. Мне нужно использовать Command<CommandType>
, но это не сработает, потому что мне нужна очередь для хранения различных типов команд.
Есть идеи для решения? Или виртуальные функции - единственный вариант?
ДОБАВЛЕНО: Командные объекты являются частью алгоритма моделирования Монте-Карло. Таким образом, вы можете иметь, что Command - это случайное число из нормального распределения, где параметры нормального распределения являются частью класса. Таким образом, шаблон команды подходит очень хорошо. У меня есть много вызовов, в определенном порядке, к функциям, которые должны поддерживать состояние.