1

可能重复:
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;
}
4

2 回答 2

5

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

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

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

于 2012-08-28T10:27:45.070 回答
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");

}
于 2012-08-28T10:25:01.680 回答