Оболочка статического массива c ++ - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать класс-оболочку для статического массива, который должен вести себя как стандартный статический массив.

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 не является массивом, но я не смог заставить его скомпилироваться.

Может кто-нибудь сказать мне, как помочь g ++ сделать шаблонный вывод для оператора [], когда T являетсямассив?

Может кто-нибудь сказать мне, как сказать оператору [] возвращать базовый тип, когда T больше не является массивом?

...