煮詰まってきたので質問させてください。

配列クラスarrayを、次のように定義します: ※エラー処理等の詳細は省略
template <class T>
class array {
T *data_;
int w_, h_;
public:
array(int w, int h) { w_ = w; h_ = h; data_ = new T[w_*h_]; };
virtual ~array() { delete[] data_; };
T get(int x, int y) { x = min(w_, max(0, x)); y = min(h_, max(0, y)); return data_[x+y*w_]; };
void set(int x, int y, const T& t) { x = min(w_, max(0, x)); y = min(h_, max(0, y)); data_[x+y*w_] = t; };
};
このクラスは2次元配列を1次元配列として実装してあります。
array<int> ia(10, 5);
ia.set(5, 3, 10);
cout << ia.get(5, 3) << endl;
というようにして、値の設定と取得ができます。
これをより簡易な表記ができるよう、[]演算子をオーバーロードしようと思いました。
添字が一つの場合は
T& operator[](int p) { return data_[min(w_*h_, max(0, p))]; };
のように書けるのですが、[]演算子への引数が二つ(xとy)あるケースでどう書けばいいかがわかりません。
ia[5][3] または ia[5, 3]
のような表記ができるようなコードは、どう書けばいいのでしょうか?