LocalArray

固定配列をメンバに持たせる場合、その領域を動的に確保して Length と一緒に管理するか、メンバ内に固定配列を用意することになるんだけど、今回は動的に確保するのはエラー処理がめんどいのでやらないことになりました。


で、当然、

class Hoge
{
    ...
};

class Moke
{
private:
    Hoge    _hoge[10];
};

って書くことになるんだろうけど、この場合、配列の長さを取得したかったら、sizeof(a)/sizeof(a[0]) みたいなマクロを使ったり、マジックナンバーを #define しておいたりするんだろうけど、それはなんかかっこ悪い。
だからといって、配列の長さを取得するために Moke::HogeLength() みたいなのを実装するのも、Length は Hoge 自体が持っておくべき情報なので違うと思う。


ということで、

class HogeArray
{
public:
    const Hoge& operator[](int index) const{ return Get(index); }
    Hoge& operator[](int index){ return Get(index); }
    int Length() const{ return sizeof(_hoge) / sizeof(_hoge[0]); }
private:
    Hoge& Get(int index)
    {
        _ASSERT(0 <= index && index < Length());
        return _hoge[index];
    }
private:
    Hoge _hoge[10];
};

こんなクラスを作ってみたわけだけど、固定配列を入れるたびにこんなのやってられねぇと思い、テンプレートにしてみました。

template<class T, int Num>
class LocalArray
{
public:
    const T& operator[](int index) const{ return Get(index); }
    T& operator[](int index){ return Get(index); }
    int Length() const{ return Num; }
private:
    T& Get(int index)
    {
        _ASSERT(0 <= index && index < Length());
        return _obj[index];
    }
private:
    T   _obj[Num];
};
class Moke
{
private:
    LocalArray<Hoge, 10>    _hoge;
};

本格的に使うには機能が足りなさすぎるけど、ちょっとしたことには使えるんでない?みたいな。