18

Definire la matrice multidimensionale utilizzando la sintassi T[][][] è semplice. Tuttavia, questo crea un tipo di matrice raw che non si adatta bene al C++ moderno. Ecco perché abbiamo std::array dal C++ 11. Ma la sintassi per definire un array multidimensionale usando std::array è piuttosto caotica. Ad esempio, per definire un array tridimensionale int, è necessario scrivere std::array<std::array<std::array<int, 5>, 5>, 5>. La sintassi non scala affatto. Sto chiedendo una soluzione per questo problema. Forse, questo problema non può essere risolto utilizzando l'utilità esistente fornita da C++. In tal caso, sono soddisfatto di uno strumento personalizzato sviluppato per semplificare la sintassi.Definisci elegante array multidimensionale in C++ moderno

Trovato un solution me stesso:

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; 

chiedendosi se l'attuazione può essere ulteriormente semplificato.

+3

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

+0

@ AngryLettuce Penso che sarebbe un po 'troppo pesante per questioni semplici come questa. Non voglio dare un intero impulso solo per questo. – Lingxi

+0

'typedef' non è accettabile:' typedef std :: array >> threeD; '..' threeD arr; arr [0] [0] [0] ... '? Questo esempio dovrebbe essere modificato per consentire diversi tipi, ovviamente, ma curioso se ciò potrebbe aiutare? – txtechhelp

risposta

7

Fare riferimento 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 è una coppia di meta-funzioni per calcolare tipo annidato per multidimensionale std::array. Il più generale MultiDimArray è un modello variadico di numeri interi senza segno per passare un numero arbitrario di dimensioni. La specializzazione di terminazione MultiDimArray definisce il caso più semplice di dimensione singola std::array.

+0

L'implementazione potrebbe essere ulteriormente semplificata? – Lingxi