您必须使用设计模式工厂
对于下面那些想要源代码的人来说,有一个快速而肮脏的工厂。它使用 c++11,它不是 const 正确的,并且对构造函数的参数有基本的支持,只要它们通过创建函数都是相同的
#include <iostream>
#include <functional>
#include <memory>
#include <map>
template<class key,class Base,class ...Args> class Factory
{
using creator = std::function<std::unique_ptr<Base>(Args...)>;
std::map<key,creator> m;
public:
void registerF(key s,creator c)
{
m[s]=c;
}
std::unique_ptr<Base> operator()(key s,Args... a)
{
return m[s](a...);
}
};
struct A{virtual void foo()=0;};
struct B1 : A{virtual void foo(){std::cout<<"B1"<<std::endl;}};
struct B2 : A{virtual void foo(){std::cout<<"B1"<<std::endl;}};
template <class T> std::unique_ptr<T> creater()
{
return std::unique_ptr<T>(new T());
}
int main() {
Factory<std::string,A> f;
f.registerF("B1",&creater<B1>);
f.registerF("B2",&creater<B2>);
auto p=f("B1");
p->foo();
return 0;
}
编辑:如果您尝试使用未注册的字符串实例化一个类,您将收到异常 bad_function_call 因为 map 的 operator[] 将是一个空的 std::function 并调用它。