T[][][]
構文を使用して多次元配列を定義するのは簡単です。ただし、これにより、最新のC++にうまく適合しない生の配列型が作成されます。そのため、C++ 11以降はstd::array
があります。しかし、std::array
を使用して多次元配列を定義する構文は非常に面倒です。たとえば、3次元のint
配列を定義するには、std::array<std::array<std::array<int, 5>, 5>, 5>
を記述する必要があります。構文はまったくスケーリングしません。この問題の修正を求めています。たぶん、この問題は、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;
実装をさらに簡素化できるかどうか疑問に思います。
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
特殊化は、1次元のstd::array
の最も単純なケースを定義します。