2012-10-28 14 views
11

Diciamo che voglio dichiarare un vettore di un vettore di un vettore di un ... (fino a n dimensioni).vettore n-dimensionale

Come così:

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; 

Esiste un modo per andare a fare questo per un n arbitrario con template metaprogrammazione?

+1

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

risposta

17

Sì, ed è piuttosto semplice.

Proprio come una dimostrazione per induzione, impostiamo un caso ricorsivo e un caso base (parzialmente specializzato) che conclude la ricorsione.

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

Vorrei suggerire di utilizzare parametri di modello variadic invece di un 'T' per permettere di passare altre cose a' std :: vector' (prende altri argomenti predefiniti). – bitmask

+0

@bitmask: nessun motivo per argomenti variadici, solo un argomento di tipo per Allocator, che dovrebbe avere lo stesso valore predefinito di 'std :: vector' stesso. Ma nel caso raro è richiesto un allocatore non standard, probabilmente si applicherà a tutti gli utilizzi di questa classe, nel qual caso può essere semplicemente inserito nella linea typedef ricorsiva. –

+0

Sì, ma dovresti specificarlo manualmente, giusto? Sembra un sacco di problemi. – bitmask