#include <map>
#include <string>

class Base {};
class MyClass1 : public Base {};
class MyClass2 : public Base {};
class MyClass3 : public Base {};
//...etc...

std::map<std::string, Base *(*)()> Factory;
#define MakeInstanceGetter(clazz) \
Base *Make_##clazz(){ return new clazz; } \
Base *(*ignore_##clazz##_clutter)() = Factory[#clazz] = &Make_##clazz
MakeInstanceGetter(MyClass1);
MakeInstanceGetter(MyClass2);
MakeInstanceGetter(MyClass3);
//...etc...

int main()
{
	Base *obj = Factory["MyClass2"]();
}