2012-10-28 128 views
11

假設我想聲明一個向量的向量...(最多n維)。n維向量

像這樣:

using namespace std; 
// for n=2 
vector<vector<int> > v2; 
// for n=3 
vector<vector<vector<int> > > v3; 
// for n=4 
vector<vector<vector<vector<int> > > > v3; 

有沒有辦法去這樣做與模板元編程的任意N?

+1

[Boost.MultiArray的(http://www.boost.org/doc/libs/1_51_0/libs/multi_array/doc/index.html) –

回答

17

是的,它非常簡單。

就像歸納證明一樣,我們設置了一個遞歸案例和一個結束遞歸的(部分專業化的)基礎案例。

template<size_t dimcount, typename T> 
struct multidimensional_vector 
{ 
    typedef std::vector< typename multidimensional_vector<dimcount-1, T>::type > type; 
}; 

template<typename T> 
struct multidimensional_vector<0,T> 
{ 
    typedef T type; 
}; 

multidimensional_vector<1, int>::type v; 
multidimensional_vector<2, int>::type v2; 
multidimensional_vector<3, int>::type v3; 
multidimensional_vector<4, int>::type v4; 
+0

我會建議使用可變參數模板參數,而不是隻一個'T'爲了允許將其他東西傳遞給'std :: vector'(它確實需要額外的默認參數)。 – bitmask

+0

@bitmask:沒有可變參數的理由,只有一個分配器的類型參數,它應該被賦予與'std :: vector'本身具有相同的默認值。但是在少數情況下需要一個非標準的分配器,它可能適用於這個類的所有用法,在這種情況下,它可以放入遞歸typedef行。 –

+0

是的,但你必須手動指定,對吧?看起來很麻煩。 – bitmask