Skip to content

Latest commit

 

History

History
65 lines (48 loc) · 1.4 KB

245.md

File metadata and controls

65 lines (48 loc) · 1.4 KB
Info

Example

template <class T, auto Dimensions> class mdarray2 {
public:
  template <class I1, class I2> constexpr T &operator[](I1 i1, I2 i2) {
    return vs_[i1][i2];
  }

private:
  std::array<std::array<T, 2>, Dimensions> vs_{};
};

int main() {
  mdarray2<int, 2> a{};
  a[1, 1] = 42;
  assert(0 == (a[0, 0]));
  assert(42 == (a[1, 1]));
}

https://gcc.godbolt.org/z/j9zh7YMz5

Puzzle

  • Can you implement a generic multidimensional array with multidimensional subscript operator?
template <class T, std::size_t N>
class mdarray; // TODO

int main() {
  using namespace boost::ut;

  "mdarray"_test = [] {
      "support multiple dimenions"_test = [] {
        mdarray<int, 2> a{2, 2};
        a[1, 1] = 42;
        expect(42_i == a[1, 1]);
      };

      "support multiple dimenions with different sizes"_test = [] {
        mdarray<int, 3> a{1, 3, 2};
        a[0, 1, 1] = 42;
        a[0, 2, 0] = 84;

        expect(0_i == a[0,0,0]);
        expect(0_i == a[0,2,1]);

        expect(42_i == a[0,1,1]);
        expect(84_i == a[0,2,0]);
      };
  };
}

https://gcc.godbolt.org/z/TP7reYK3b

Solutions