template<typename T>
class array1d {
public:
template<int N>
explicit array1d(T (&x)[N]) : p_(x), n_(N) {}

array1d(T * p, int n) : p_(p), n_(n) {}

T& operator [] (int i) { return p_[i]; }
private:
T * p_;
const int n_;
};

template<typename T>
class array2d {
public:
template<int N, int M>
explicit array2d(T (&x)[N][M]) : p_(*x), n_(N), m_(M) {}

array1d<T> operator [] (int i) { return array1d<T>(p_ + m_ * i, m_); }
private:
T * p_;
const int n_, m_;
};
作ってみたものの、気持ち悪いな
テンプレート引数で次元を設定して――とかやるのは面倒そうだし