2012-10-28 14 views
11

Załóżmy, że chcę zadeklarować wektor wektora wektora ... (do n wymiarów).N-wymiarowy wektor

tak:

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; 

Czy istnieje sposób, aby przejść o to zrobić dla dowolnego n z szablonu metaprogramowanie?

+1

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

Odpowiedz

17

Tak, i to całkiem proste.

Podobnie jak dowód przez indukcję, stworzyliśmy przypadek rekurencyjny i (częściowo wyspecjalizowany) podstawowy przypadek, który kończy rekursję.

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

Proponuję użyć zmiennej liczbie argumentów parametrów szablonu, a nie tylko jedno 'T', aby umożliwić przekazanie innych rzeczy do' std :: vector' (pobiera dodatkowe domyślne argumenty). – bitmask

+0

@bitmask: Brak powodu dla argumentów variadic, tylko jeden argument typu dla Allocator, któremu powinno się nadać to samo domyślne ustawienie, jakie ma 'std :: vector'. Jednak w rzadkich przypadkach potrzebny jest niestandardowy alokator, najprawdopodobniej będzie on dotyczył wszystkich przypadków użycia tej klasy, w którym to przypadku może on zostać umieszczony w rekurencyjnej linii typedef. –

+0

Tak, ale trzeba to określić ręcznie, prawda? Wydaje się, że masz dużo problemów. – bitmask