14

C++0x Variadic Templates Proposal paper Linkには、任意の数の次元をサポートするクラスの例があります。以下にコピーしました。

template<typename T, unsigned PrimaryDimension, unsigned... Dimensions>
class array { /* implementation */ };

array<double, 3, 3> rotation matrix; // 3x3 rotation matrix

残念ながら、実装は提供されていません。私は可変個引数テンプレートに比較的慣れていないので、このコンテナーの実装に興味があります。

簡単な実装を提供できる人に感謝します。

4

1 に答える 1

27

これは非常に単純な実装 (gcc4.6.1 でコンパイル) で、配列型を正しく取得するための再帰を示しています。他に興味のある特定の実装の詳細がある場合は、お知らせください。

template<class T, unsigned ... RestD> struct array;

template<class T, unsigned PrimaryD > 
  struct array<T, PrimaryD>
{
  typedef T type[PrimaryD];
  type data;
  T& operator[](unsigned i) { return data[i]; }

};

template<class T, unsigned PrimaryD, unsigned ... RestD > 
   struct array<T, PrimaryD, RestD...>
{
  typedef typename array<T, RestD...>::type OneDimensionDownArrayT;
  typedef OneDimensionDownArrayT type[PrimaryD];
  type data;
  OneDimensionDownArrayT& operator[](unsigned i) { return data[i]; }
}; 

int main()
{
    array<int, 2, 3>::type a4 = { { 1, 2, 3}, { 1, 2, 3} };
    array<int, 2, 3> a5{ { { 1, 2, 3}, { 4, 5, 6} } };
    std::cout << a5[1][2] << std::endl;

    array<int, 3> a6{ {1, 2, 3} };
    std::cout << a6[1] << std::endl;

    array<int, 1, 2, 3> a7{ { { { 1, 2, 3}, { 4, 5, 6 } } }};
    std::cout << a7[0][1][2] << std::endl;
}
于 2011-08-14T17:21:59.103 に答える