2012-12-12 45 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; 

但請注意,此不允許您從矢量訪問對象的模板化部分。

您需要弄清楚哪些(如果有的話)適合您要解決的問題。