当类名存储在另一个变量中时,如何创建类的实例

时间:2012-08-28 10:22:59

标签: c++ templates

  

可能重复:
  minimal reflection in C++

基本上我将类名存储在char *中,如何创建该类的实例。 以下是我的想法。当我将Test作为模板参数传递时很有效,但是如果我尝试这样的Test *t = CreateType<ptr>,它将不起作用。

有没有办法让这项工作。

class Test{
public:
    Test() {
    }
    ~Test() {
    }
};

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

int main ( int argc, char **argv) {
    char *ptr = "Test";
    Test *T = CreateType<Test>();
    return 0;
}

2 个答案:

答案 0 :(得分:5)

在C ++中不可能直接,因为语言不是内省的。

你可以尝试做类似的东西。例如,您可以使用map< string, baseClassPointer >,其中键将是类的名称,值将是指向该类对象的指针。然后,您可以通过从地图复制对象来创建其他对象(可以通过类型名称获取)。我不建议做那样的事情。

工厂模式可能适合您的需求。

答案 1 :(得分:4)

这在C ++中是不可能的,因为在C ++中没有像反射这样的机制。你能做的就是编写一个知道如何从字符串构造对象的工厂。

class Base
{
public:
    virtual ~Base(){}
};

class Factory
{
public:
    typedef std::function<Base*()> Creator;

    void Register(const std::string& key, Creator creator)
    {
        creators_[key] = creator;
    }

    std::unique_ptr<Base> Create(const std::string& key)
    {
        auto creator = creators_[key];
        auto instance = std::unique_ptr<Base>(creator());
        return instance;
    }

private:
    std::unordered_map<std::string, Creator> creators_;
};


class Concrete : public Base
{

};


int main()
{
    Factory factory;
    factory.Register("Concrete", [](){ return new Concrete;});

    auto instance = factory.Create("Concrete");

}