我希望能够从字符串初始化一个类(我给“MyClass”,它会创建一个对象MyClass)。
我知道不可能这样做所以我创建了一个类,它有一个带有字符串作为键的映射,以及一个指向函数(创建对象)的指针作为值。
动态创建对象对我和我的地图来说不是问题。
template<typename T> JsonSerializable* createInstance() { return new T; }
我的问题是我想动态地将类添加到我的地图中。那可能吗 ? 我该怎么做:
void MyFactory::addNewClass(std::string& name, class c)
{
map[name]=&createInstance<c>();
}
我可以将指针或其他东西传递给类本身(而不是对象)吗?并使用它来动态创建所有内容。
如果不可能,我将不得不对其进行硬编码。
答案 0 :(得分:1)
好的..所以,如果你正在使用C ++ 11,那么lambdas可以帮助你获得你正在寻找的通用行为。
首先,我们需要一个SuperBase
,所有类都应该从这个
class SuperBase {};
class A : public SuperBase {};
class B: public SuperBase {};
然后创建一个以std::string
为键,std::function
为值的地图。
map<string,std::function<SuperBase*()>> myMap;
函数返回类型为SuperBase
,addNewClass
函数可以定义为
template <typename type>
void addNewClass(std::string name) {
myMap[name] = []() { return new type();};
}
因此,从main函数可以将函数调用为
addNewClass<A>("A");
addNewClass<B>("B");
然后在迭代时你可以调用函数来获得所需的指针
for( auto mapPair : myMap) {
cout<<mapPair.first<<endl;
SuperBase * sBase = mapPair.second();
}
请记住,virtual
中的SuperBase
函数需要具有多态行为,然后一切都应该有效
希望有所帮助