C++, получение имени плагина из производного класса

У меня есть требование, в котором мне нужно создать базовый класс, который будет иметь некоторые чистые виртуальные функции, которые будут реализованы производными классами. Этих виртуальных функций недостаточно, и мне также нужно получить имя плагина, который будет передан библиотеке из базового класса, который я создам. Я использую заводской шаблон. В основном думал, что на основе имени плагина я создам экземпляр этого конкретного производного класса. Но проблема здесь в том, что я использую фабричный шаблон, пока я не отправлю имя плагина, я не буду создавать объект, и пока объект не будет создан, имя плагина не будет известно. Из-за этого я всегда вижу пустое имя плагина.

Многие плагины были бы производными от этого общего базового класса, важно знать имя плагина во время выполнения.

Пожалуйста, предложите

Добро пожаловать в Stack Overflow. Пожалуйста, прочтите страницы помощи, возьмите SO тур, прочтите про как задавать хорошие вопросы, а также этот контрольный список вопросов. Наконец, узнайте, как создать Минимальный, полный и проверяемый пример.

Some programmer dude 13.09.2018 18:48
0
1
42
1

Ответы 1

Вам необходимо зарегистрировать фабрику для каждого типа плагинов на центральной фабрике.

struct common_args {
  int width; // whatever
};

struct BasePlugin {
  virtual ~BasePlugin() {}
  virtual std::string get_name() const = 0;
  virtual void do_stuff() = 0;
};

using single_type_factory = std::function<std::unique_ptr<BasePlugin>( common_args ) >;

using plugin_factory = std::function<std::unique_ptr<BasePlugin>( std::string name, common_args ) >;

struct central_factory:plugin_factory {
  central_factory(central_factory&&)=delete;
  central_factory():
    plugin_factory(
      [this](std::string name, common_args args)
      ->std::unique_ptr<BasePlugin>
      {
        auto it = m_factories.find(name);
        if (it == m_factories.end())
          return {};
        return (*it)(args);
      }
    )
  {}
  void register_plugin_type( std::string name, single_type_factory f ) {
    m_factories[name] = f;
  }
private:
  std::unordered_map<std::string, single_type_factory> m_factories;
};

это всего лишь набросок.

Другие вопросы по теме