我希望能够从字符串初始化一个类(我给“ MyClass”,它将创建一个对象MyClass)。

我知道不可能这样做,所以我创建了一个类,该类具有一个以字符串为键的映射和一个指向函数(创建对象)的指针作为值的映射。

动态创建对象与我的地图无关。

template<typename T> JsonSerializable* createInstance() { return new T; }


我的问题是我想将类动态添加到地图中。那可能吗 ?
我能怎么做 :

void MyFactory::addNewClass(std::string& name, class c)
{
    map[name]=&createInstance<c>();
}


我可以将指针或其他内容传递给类本身(而不是对象)吗?并使用它动态创建所有内容。

如果不可能的话,我将不得不对其进行硬编码。

最佳答案:

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
函数具有多态行为,然后一切正常

希望能帮助到你