hayateasdf's blog

Unity,C#, javascript,C++,python,batなど

クラス生成をマップ化

#include <memory>
#include <stdio.h>
#include <string>
#include <map>

template<typename T, typename U>
class ICreator
{
public:
	virtual ~ICreator(){}
	static T* Creator(){ return new U; }
};
class Base
{
public:
	virtual ~Base(){}
	virtual void print() = 0;
};
class A : public Base, public ICreator<Base, A>{ void print(){ printf("Aクラスだお。\n"); } };
class B : public Base, public ICreator<Base, B>{ void print(){ printf("Bクラスだお。\n"); } };

int main()
{
	typedef Base* (*Func)();
	
	std::map<std::string, Func> class_map;
	class_map["Aクラス"] = &A::Creator;
	class_map["Bクラス"] = &B::Creator;

	std::unique_ptr<Base> b;

	b.reset(class_map["Aクラス"]());
	b->print();

	b.reset(class_map["Bクラス"]());
	b->print();

	return 0;
}

多重継承だおw。なんとエラー処理書いてないおww