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;
}

こうやって書けば完成ヽ(´ー`)ノ




違います(・∀・)




残念ながら、こいつには重大な問題があるのです。