2012-12-12 46 views
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

你可以从一个普通的非模板类派生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); 
} 
+1

通常(或不那么常见)称为外部多态性。 – Chad

+0

但是,此向量可能包含从Base派生的对象,但不能从BaseAtom派生。 –

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; 

但请注意,此不允许您从矢量访问对象的模板化部分。

您需要弄清楚哪些(如果有的话)适合您要解决的问题。