twion paranoia

Material

refFolder

C++で参照の配列が使えないという話題からの派生物。
代替案として参照もしくはポインターを薄いラッパーで包んで使用感をそれらしくしたもの。
参照版とポインター版があるが大差は無い。

ポインター版

template<typename T>
class refFolder {
public:
    refFolder(T& value) : value_(&value) {}
    operator T&() const { return *value_; }
    T& get() const { return *value_; }
    T* operator &() const { return value_; }
    T* get_ptr() const { return value_; }

    T& operator =(const T& rhs) { *value_=rhs; return *value_; }    
    refFolder<T>& operator =(const refFolder<T>& rhs)
    {
        if(*this!=rhs) *value_=*rhs.value_;
        return *this;
    }

    refFolder<T>& clone(refFolder<T>& rhs)
    {
        if(*this!=rhs) rhs.value_=value_;
        return *this;
    }

    refFolder<T>* this_ptr() const { return this; }
private:
    T* value_;
};

参照版

template<typename T>
class refFolder {
public:
    refFolder(T& value) : value_(value) {}
    operator T&() const { return value_; }
    T& get() const { return value_; }
    T* operator &() const { return &value_; }
    T* get_ptr() const { return &value_; }

    T& operator =(const T& rhs) { value_=rhs; return value_; }    
    refFolder<T>& operator =(const refFolder<T>& rhs)
    { 
        if(*this!=rhs) value_=rhs.value_;
        return *this;
    }

    refFolder<T>* this_ptr() const { return this; }
    //refFolder<T>* clone() const { return new refFolder<T>(*this); }
    // お好みでJava風cloneメソッド
    //(個人的にはraw pointer投げになるので好きじゃないけどね;)
private:
    T& value_;

    refFolder<T>& clone(refFolder<T>& rhs); // 内部も参照なのでコピーは出来ない
};

使用例

int main() // お試し
{
    int a=1,b=2,c=3;
    refFolder<int> ref[3]={a,b,c};
    for(int i=0;i<3;i++)
        std::cout << ref[i] << std::endl;
    ref[0]=4;
    std::cout << a << std::endl;
    std::cout << &a << " " << &ref[0] << std::endl;
    return 0;
}

実行結果
    1
    2
    3
    4
    0012FED4 0012FED4