18

Definiowanie wielowymiarowej tablicy za pomocą składni T[][][] jest łatwe. Tworzy to jednak surową tablicę, która nie pasuje do nowoczesnego C++. Dlatego mamy std::array od C++ 11. Ale składnia definiująca wielowymiarową tablicę przy użyciu std::array jest dość niechlujna. Na przykład, aby zdefiniować trójwymiarową tablicę int, trzeba napisać std::array<std::array<std::array<int, 5>, 5>, 5>. Składnia nie skaluje się wcale. Proszę o poprawkę dla tego problemu. Może ten problem nie może zostać naprawiony przy użyciu istniejącego narzędzia dostarczanego przez C++. W takim przypadku jestem zadowolony z niestandardowego narzędzia opracowanego w celu ułatwienia składni.Elegancko definiuj wielowymiarową tablicę w nowoczesnym C++

Znaleziono solution sobie:

template <typename T, std::size_t n, std::size_t... ns> 
struct multi_array { 
    using type = std::array<typename multi_array<T, ns...>::type, n>; 
}; 

template <typename T, std::size_t n> 
struct multi_array<T, n> { 
    using type = std::array<T, n>; 
}; 

template <typename T, std::size_t... ns> 
using multi_array_t = typename multi_array<T, ns...>::type; 

Zastanawiasz się, czy realizacja może być jeszcze bardziej uproszczone.

+3

[Boost.MultiArray] (http://www.boost.org/doc/libs/1_60_0/libs/multi_array/doc/user.html#sec_example) na ratunek? –

+0

@AngryLettuce Myślę, że byłoby to trochę za ciężkie na takie proste sprawy jak ta. Nie chcę wciągać całego Boosta tylko po to. – Lingxi

+0

Czy 'typedef' jest niedopuszczalne:' typedef std :: array >> threeD; '..' threeD arr; arr [0] [0] [0] ... '? Ten przykład musiałby zostać zmodyfikowany, aby umożliwić różne typy, oczywiście, ale ciekawy, czy to mogłoby pomóc? – txtechhelp

Odpowiedz

7

Patrz Multi-dimensional arrays in C++11

template <class T, std::size_t I, std::size_t... J> 
struct MultiDimArray 
{ 
    using Nested = typename MultiDimArray<T, J...>::type; 
    // typedef typename MultiDimArray<T, J...>::type Nested; 
    using type = std::array<Nested, I>; 
    // typedef std::array<Nested, I> type; 
}; 

template <class T, std::size_t I> 
struct MultiDimArray<T, I> 
{ 
    using type = std::array<T, I>; 
    // typedef std::array<T, I> type; 
}; 

MultiDimArray<float, 3, 4, 5, 6, 7>::type floats; 

MultiDimArray jest para meta-funkcji do obliczania typu zagnieżdżonego do wielowymiarowego std::array. Najbardziej ogólny MultiDimArray jest szablonem liczb niepodpisanych liczb całkowitych, aby przekazać dowolną liczbę wymiarów. Kończąca specjalizacja MultiDimArray definiuje najprostszy przypadek jednowymiarowego std::array.

+0

Czy można jeszcze bardziej uprościć implementację? – Lingxi