C++ c++;静态数组包装器

C++ c++;静态数组包装器,c++,operator-overloading,template-argument-deduction,C++,Operator Overloading,Template Argument 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; } 另外,当ArrayWrapper仅包

我正在尝试为静态数组构建一个包装器类,它的行为应该类似于标准的静态数组

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;
}
另外,当
ArrayWrapper
仅包含一个维度时,我不知道如何专门化
[]操作符来返回基本类型。我猜当T不是数组但无法使其编译时,我应该专门化运算符

有人能告诉我当T是数组时,如何帮助g++为[]操作符进行模板推导吗


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

为什么不使用
std::array
?你的意思是我可以从std::array继承来重写[]运算符以执行我想要的操作?不,只需使用
std::array
。如果我理解正确,
std::array::operator[]
已经做了您想要做的事情(即它返回一个数组,您可以再次调用
operator[]
来获取元素),而不是从标准容器继承
#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;
};
error: no match for ‘operator[]’ (operand types are ‘ArrayPrinter<int [3], 2>’ and ‘int’)
   auto b = a[0];