2011-08-14 17 views
9

W dokumencie Propozycje zmiennych V ++ C++ 0x Link znajduje się przykład klasy, która obsługuje dowolną liczbę wymiarów. Skopiowałem to poniżej:Szablony wielowymiarowe Tablica wielowymiarowa

template<typename T, unsigned PrimaryDimension, unsigned... Dimensions> 
class array { /* implementation */ }; 

array<double, 3, 3> rotation matrix; // 3x3 rotation matrix 

Niestety nie ma wdrożenia. Ponieważ jestem stosunkowo nowy w szablonach variadic, chciałbym zobaczyć implementację tego kontenera.

Dziękuję każdemu, kto może zapewnić prostą implementację.

Odpowiedz

15

Tutaj jest bardzo prosta implementacja (skompilowany z gcc4.6.1), który pokazuje poziom zagnieżdżenia zaangażowany w uzyskanie odpowiedniego typu array - czy istnieje jakiś inny detal specyficzny realizacja jesteś zainteresowany, proszę dać nam znać:

template<class T, unsigned ... RestD> struct array; 

template<class T, unsigned PrimaryD > 
    struct array<T, PrimaryD> 
{ 
    typedef T type[PrimaryD]; 
    type data; 
    T& operator[](unsigned i) { return data[i]; } 

}; 

template<class T, unsigned PrimaryD, unsigned ... RestD > 
    struct array<T, PrimaryD, RestD...> 
{ 
    typedef typename array<T, RestD...>::type OneDimensionDownArrayT; 
    typedef OneDimensionDownArrayT type[PrimaryD]; 
    type data; 
    OneDimensionDownArrayT& operator[](unsigned i) { return data[i]; } 
}; 

int main() 
{ 
    array<int, 2, 3>::type a4 = { { 1, 2, 3}, { 1, 2, 3} }; 
    array<int, 2, 3> a5{ { { 1, 2, 3}, { 4, 5, 6} } }; 
    std::cout << a5[1][2] << std::endl; 

    array<int, 3> a6{ {1, 2, 3} }; 
    std::cout << a6[1] << std::endl; 

    array<int, 1, 2, 3> a7{ { { { 1, 2, 3}, { 4, 5, 6 } } }}; 
    std::cout << a7[0][1][2] << std::endl; 
} 
+0

Dziękuję za odpowiedź, Faisal. To po prostu niesamowite. Bardzo elegancko. Pytałem głównie dlatego, że mam wielowymiarową bibliotekę rozmiarów o stałym rozmiarze (Link tutaj: http://code.google.com/p/fsma/), która zapewnia cienkie opakowania wokół wbudowanych macierzy 2d i 3d i jest analogiczna do std: :szyk. Zastanawiałem się, jak zaimplementować wersję, która pozwala na dowolną liczbę wymiarów przy użyciu szablonów variadic po przeczytaniu na nich standardowego dokumentu komisji. Nie wiedziałem o sile szablonów variadycznych, dopóki nie przeczytam twojej odpowiedzi! – Ricky65

+0

W komentarzu @ faisal-vali z 2011 r. Do sierpnia 14 r. Nie jestem pewien, co próbujesz zbudować. Czy nie "szablon tablicaX " tłumaczyć na coś takiego jak 'tablicaX ' dany 'długi, 2, 3, 5 'jako parametry. Parametr variadic musi rozwinąć się do listy rozdzielanej przecinkami, której zagnieżdżone granice nie kwalifikują się jako. – CTMacUser

+0

@CTMacUser Tak, oczywiście, masz rację - mój komentarz jest pozbawiony sensu i powinien zostać dotknięty. –

Powiązane problemy