デザインパターンファクトリーを使用する必要があります
ソースコードが必要な以下の人のために、クイックアンドダーティファクトリがあります。これは c++11 を使用し、const-correct ではなく、作成関数によってすべて同じである限り、コンストラクターの引数の基本的なサポートを備えています。
#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;
}
編集: 登録されていない文字列でクラスをインスタンス化しようとすると、マップの operator[] が空の std::function を呼び出して呼び出すため、例外 bad_function_call が発生します。