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