【问题标题】:C++, getting name of the plugin from derived classC++,从派生类中获取插件的名称
【发布时间】:2019-02-18 11:01:32
【问题描述】:

我有一个要求,我需要创建一个基类,该基类将具有一些由派生类实现的纯虚函数。这些虚函数还不够,我还需要从我将创建的基类中获取要提供给库的插件名称。 我正在使用工厂模式。基本上认为基于插件名称我会创建该特定派生类的实例。 但是,这里的问题是,因为我使用的是工厂模式,所以在我发送插件名称之前我不会创建对象,并且在创建对象之前插件名称是未知的。因此,我总是看到空插件名称。

许多插件都是从这个公共基类派生的,在运行时知道插件的名称很重要。

请推荐

【问题讨论】:

标签: c++11


【解决方案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;
};

这只是一个草图。

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2010-11-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多