0

各オブジェクトが異なる特殊な型を持つ、パラメトリック型のオブジェクトのベクトルを作成したいと考えています。例:

template<typename A>
struct BaseAtom
{
    A _a;
};

struct AtomA : BaseAtom<int>
{};

int main()
{
    std::vector<BaseAtom*> v; // (1)

    AtomA a;

    v.push_back(&a);
}

論理的には、BaseAtom はテンプレート型であり、(1) でテンプレート引数が指定されていないため、これは機能しません。この特性を持つベクトルを作成するにはどうすればよいですか?

4

2 に答える 2

4

テンプレート化されていない一般的なクラスから派生BaseAtom<A>させ、そのクラスへのポインターを格納できます。

struct Base {};

template<typename A>
struct BaseAtom: Base
{
    A _a;
};

struct AtomA : BaseAtom<int>
{};

int main()
{
    std::vector<Base*> v; // (1)

    AtomA a;

    v.push_back(&a);
}
于 2012-12-12T17:06:58.927 に答える
2

テンプレートの特殊化を選択して、ベクターに入れます。

std::vector<BaseAtom<int>*> v;

または非テンプレート基本クラスを定義します。

struct BaseAtomBase {};  // put anything independent of the template parameter here

template <typaname A>
struct BaseAtom : BaseAtomBase
{
    A _a;
};

std::vector<BaseAtomBase*> v;

ただし、ベクトルからオブジェクトのテンプレート化された部分にアクセスできないことに注意してください。

解決しようとしている問題にこれらのどれが適しているかを判断する必要があります。

于 2012-12-12T17:09:51.840 に答える