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 >、キーがクラスの名前になり、値がそのクラスのオブジェクトへのポインターになる場所を持つことができます。次に、マップからオブジェクトをコピーすることにより、他のオブジェクトを作成できます (タイプ名で取得できます)。ただし、そのようなことをすることはお勧めしません。

ただし、工場のパターンはニーズに合う場合があります。

于 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 に答える