18

die T[][][] Syntax mehrdimensionales Array definieren ist einfach. Dies erzeugt jedoch einen unformatierten Array-Typ, der nicht in modernes C++ passt. Deshalb haben wir seit C++ 11 std::array. Aber die Syntax zum Definieren eines mehrdimensionalen Arrays unter Verwendung von ist ziemlich unordentlich. Um zum Beispiel ein dreidimensionales int Array zu definieren, müssten Sie std::array<std::array<std::array<int, 5>, 5>, 5> schreiben. Die Syntax wird nicht skaliert. Ich frage nach einer Lösung für dieses Problem. Möglicherweise kann dieses Problem nicht mit dem vorhandenen Dienstprogramm von C++ behoben werden. In diesem Fall bin ich mit einem benutzerdefinierten Tool zufrieden, das entwickelt wurde, um die Syntax zu vereinfachen.Elegantly mehrdimensionales Array in modernen C++ definieren

ein solution mich gefunden:

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; 

Sie fragen sich, ob die Umsetzung weiter vereinfacht werden kann.

+3

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

+0

@AngryLettuce Ich denke, das wäre für einfache Dinge wie diese etwas zu schwer. Ich möchte nicht einfach einen ganzen Boost reinziehen. – Lingxi

+0

Sind 'typedef' ist nicht akzeptabel:' typedef std :: array >> Threed; '' .. Threed arr; arr [0] [0] [0] ... '? Dieses Beispiel müsste natürlich geändert werden, um verschiedene Typen zuzulassen, aber neugierig, ob das helfen könnte. – txtechhelp

Antwort

7

Siehe 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 ist ein Paar von meta-Funktionen verschachtelten Typen für mehrdimensionale std::array zu berechnen. Die allgemeinste MultiDimArray ist eine variadische Vorlage von Ganzzahlen ohne Vorzeichen, um eine beliebige Anzahl von Dimensionen zu übergeben. Die abschließende MultiDimArray Spezialisierung definiert den einfachsten Fall der eindimensionalen std::array.

+0

Kann die Implementierung weiter vereinfacht werden? – Lingxi