2012-10-28 11 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

私はちょうど代わりの可変長引数テンプレートパラメータを使用することをお勧めします他のものを 'std :: vector'に渡せるようにするために' T 'を使います(デフォルトの引数を追加します)。 – bitmask

+0

@bitmask:可変引数の理由はありません。アロケータの1つの型引数です。これは、 'std :: vector'と同じデフォルトを与えなければなりません。まれに、非標準のアロケータが必要な場合は、このクラスのすべての使用法に適用されます。この場合、再帰的なtypedef行に入れることができます。 –

+0

はい、手動で指定する必要がありますか?多くのトラブルのように思えます。 – bitmask