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

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

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

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

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

Войти через центр авторизации
Похожие вопросы