@MuffinLover

Фабричный метод. Как создать рефлексивно по имени поля класс, наследуемый от абстрактного?

Есть абстрактный класс:

class Block {
public:
 
    size_t id;
    std::string command_name;
    std::vector<std::string> args;
 
 
    virtual ~Block() = default;
 
    [[nodiscard]] virtual std::string operation() = 0;
};

Хочу воспользоваться фабричным методом для создания объектов классов, которые наследуются от абстрактного.
Как мне это красиво сделать?
Чтобы можно было например задать в переопределяющих методах константно command_name поле и по нему рефлексивно создавать как-то объект.

Т.е на вход подается строка command_name и мы по этой строке создаем класс, который определяет эту команду.
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
В С++ рефлексии нет. Только ручками. Где-то придется писать список всех классов и по всем им пробегаться и сравнивать строку. Ну или map какой-то создать. В качестве ключа вставлять команду, в качестве значения - функцию создающую объект конкретного класса.

Как вариант, можно как-то упростить себе работу с помощью шаблонной магии. Шаблон будет принимать список всех классов, сравнивать первый с заданной командой и или рекурсивно вызваться дальше или создавать объект текущего класса.

Пример можно посмотреть вот тут. Там CreateEncoderInternal делает практически то, что вам надо. Только там не константное поле command проверяется, а проверяется, что заданный формат есть в статическом списке в текущем классе.

И все-равно где-то в коде надо прописать список всех возможных классов, как тут.
Ответ написан
Комментировать
Adamos
@Adamos
С++ - мультипарадигменный язык.
Но компиляция логики на лету в нем не реализована, она свойственна скриптовым языкам и виртуальным машинам, но не машинному коду, в который собирается программа на С++.
Поэтому выстраивание логики программы на С++ так, как вы ее описываете - это либо заведомо неудачный выбор инструмента для поставленной задачи, либо заведомо неверно поставленная задача.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы