BREW vector(2)
昨日の
実装の仕方だと、委譲される側もメンバ関数テンプレートを使うことになってしまいます。
vectorはテンプレートですが、移譲先は非テンプレートで、staticな関数になります。
なので、委譲するときに、thisポインタと型の大きささえ渡してやれば、これらを実行することが出来るようになります。
つまり、
class vector_helper{ static void insert( void* p , size_type n , void* _P , size_type _M , const void* _X ){} };
vector_helper::insert( this , sizeof( _Ty ) , _P , _M , &_X );
こんな感じでしょうか。
ただ、vectorをvoidにすると、メンバにアクセスするときにキャストするのが面倒なので、
vector_proxy{ void* _First; void* _Last; void* _End; };
こんなクラスを作って、それを疑似vectorとします。
あと、ポインタで渡すより、参照で渡した方が、より同じ意味になるので、
class vector_helper{ static void insert( vector_proxy& v , size_type n , void*& _P , size_type _M , const vector_proxy& _X ){} };
vector_helper::insert( *(vector_proxy*)this , sizeof( _Ty ) , *(void**)&_P , _M , *(const vector_proxy*)&_X );
こんな感じにしてやります。
これで準備完了。
では実際に、
explicit vector( size_type _N , const _Ty& _V = _Ty() ){ _First = _allocate( _N ); _Ufill( _First , _N , _V ); _Last = _First + _N; _End = _Last; }
このメソッドを委譲してみようと思います。
委譲する側は、
explicit vector( size_type _N , const _Ty& _V = _Ty() ){ vector_helper::constructor( *(vector_proxy*)this , sizeof( _Ty ) , _N , *(const vector_proxy*)&_V ); }
こんな感じで書いて、
委譲される側は、
static void constructor( vector_proxy& v , size_type n , size_type _N , const vector_proxy _V ){ v._First = _allocate( n , _N ); _Ufill( v._First , _N , _V ); v._Last = (void*)((byte*)v._First + n * _N); v._End = v._Last; }
こうやって書けば完成ヽ(´ー`)ノ
違います(・∀・)
残念ながら、こいつには重大な問題があるのです。