web-dev-qa-db-ja.com

最新のC ++で多次元配列をエレガントに定義する

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;

実装をさらに簡素化できるかどうか疑問に思います。

24
Lingxi

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の最も単純なケースを定義します。

10
zangw