我有一个 C++ 纯虚拟基类/接口,其中有几个实现在代码的不同位置定义,以后可能会添加其他实现。我需要一种方法来注册可用的实现,(从配置文件、用户输入等)读入要使用的接口的实现,然后构造该实现的实例。
我怎样才能以一般方式做到这一点(即,表驱动,而不是使用明确列出每个实现的 switch/case 语句)?我无法确定如何从指示类型的运行时值转换为我可以实例化的编译时类型。
boost有这样的东西吗?
我有一个 C++ 纯虚拟基类/接口,其中有几个实现在代码的不同位置定义,以后可能会添加其他实现。我需要一种方法来注册可用的实现,(从配置文件、用户输入等)读入要使用的接口的实现,然后构造该实现的实例。
我怎样才能以一般方式做到这一点(即,表驱动,而不是使用明确列出每个实现的 switch/case 语句)?我无法确定如何从指示类型的运行时值转换为我可以实例化的编译时类型。
boost有这样的东西吗?
标准方法涉及一种称为factory的创建 模式,它根据用户提供的标识符实例化具体类型。
如果您已经在使用 Boost,请查看Boost.Functional/Factory,但自己构建基于表的调度机制并不是很困难。这是您如何使用具有运行时多态性的 Boost 版本:
struct abstract
{
virtual ~abstract() = default;
virtual void f() = 0;
};
struct concrete1 : abstract
{
virutal void f() override;
};
struct concrete2 : abstract
{
virutal void f() override;
};
typedef boost::function<abstract*()> abstract_factory;
int main()
{
// Here, each factory refers to a function, although sometimes
// people use the term factory to mean the dispatch table itself.
std::map<std::string, abstract_factory> factories;
factories["foo"] = boost::factory<concrete1*>();
factories["bar"] = boost::factory<concrete2*>();
// Create a new concrete object.
auto foo = factories["foo"]();
// vtable dispatch "concrete1".
foo->f();
...
}