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.
[Boost.MultiArray] (http://www.boost.org/doc/libs/1_60_0/libs/multi_array/doc/user.html#sec_example) na ratunek? –
@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
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