c ++静态数组包装器

时间:2018-05-22 14:50:22

标签: c++ operator-overloading template-deduction

我正在尝试为静态数组构建一个包装类,它应该像标准静态数组一样。

int main()
{
  int t[2][3] = {{77, 2, 3}, {4, 5, 6}};
  auto a = make_array(t);
  auto b = a[0]; // gives a ArrayWrapper<int, 3>
  auto c = b[0]; // gives an int of value 77;
  return 0;
}

到目前为止,我已经编写了以下类和构造函数:

#include <cstdlib>

template <typename T, size_t N>
struct ArrayWrapper;

template<typename T, size_t N>
auto make_array(T const (&tab) [N])
{
  return ArrayWrapper<T, N>(tab);
}


template <typename T, size_t N>
struct ArrayWrapper
{
  ArrayWrapper(T const (&tab)[N])
    : t(tab)
  {
  }

  template<typename U, size_t M>
    ArrayWrapper<U, M> operator[] (size_t i)
    {
      return make_array<U, M>(t[i]);
    }

  T const & t;
};

不幸的是,在b g ++的影响期间,我发现了以下错误:

error: no match for ‘operator[]’ (operand types are ‘ArrayPrinter<int [3], 2>’ and ‘int’)
   auto b = a[0];

另外,当[] operator只包含一个维度时,我不知道如何专门化ArrayWrapper来返回基本类型。我猜我应该专注于T不是数组时的运算符,但是我无法编译它。

当T是一个数组时,有人能告诉我如何帮助g ++对[]运算符进行模板推导吗?

当T不再是数组时,有人能告诉我如何告诉[]运算符返回基本类型吗?

0 个答案:

没有答案