18

T[][][]構文を使用して多次元配列を定義するのは簡単です。しかし、これは現代のC++にうまく収まらない生の配列型を作成します。だからこそ、C++ 11以降、std::arrayがあるのです。しかし、std::arrayを使用して多次元配列を定義する構文は非常に面倒です。たとえば、3次元のint配列を定義するには、std::array<std::array<std::array<int, 5>, 5>, 5>と記述する必要があります。構文はまったくスケールされません。私はこの問題の修正を求めています。たぶん、この問題は、C++で提供されている既存のユーティリティを使って修正することはできません。その場合、構文を簡単にするために開発されたカスタムツールがうれしいです。実装がさらに簡素化することができるかどうかを疑問に思う最新のC++で多次元配列をエレガントに定義

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; 

solution自分自身を発見しました。

+3

[Boost.ultiArray] –

+0

@AngryLettuce私はそれがこのような単純な問題には少し重すぎると思う。私はこれのためだけにBoost全体を引っ張ってはいけません。 – Lingxi

+0

'typedef'は受け入れられません:' typedef std :: array > threeD; '..' threeD arr; arr [0] [0] [0] ... '?この例は、明らかに異なるタイプを許可するように変更する必要がありますが、それが役立つかどうか不思議ですか? – txtechhelp

答えて

7

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を参照してくださいは、多次元std::arrayためのネストされた型を計算するメタ関数のペアです。最も一般的なMultiDimArrayは、任意の次元数を渡すための可変長の符号なし整数テンプレートです。終端のMultiDimArray特殊化は、一次元の最も単純な場合を定義しますstd::array

+0

実装をさらに簡素化できますか? – Lingxi