2

テンプレートに特化したクラスのコード重複を減らすには?

私はクラス ( MyArray)を作成しようとしてstd::vectorいますが、一部の関数のパラメーターとして raw-pointer を受け取ります。

これはそれの簡略化されたバージョンです:-

template<class T> class MyArray{
    T database[10];
    public: T& get(int index){return database[index];}
    void set(int index, T t){
        database[index]=t;
    }
};
template<class T> class MyArray<std::unique_ptr<T>>{
    T* database[10];
    public: T*& get(int index){return database[index];}
    void set(int index, std::unique_ptr<T> t){
        T* tmp=t.release();
        database[index]=tmp;  
    }
};

ここにテストがあります: -

class B{};
int main() {
    MyArray<B>   test1;
    MyArray<B*>  test2;
    MyArray<std::unique_ptr<B>> test3;
    test3.set(2,std::make_unique<B>()));
    return 0;
}

質問: で上記のコードの重複を減らすエレガントな方法を示してくださいMyArray

私が望んでいた解決策は次のようになります:-

template<class T> class MyArray{
    using U = if(T=std::uniquePtr<X>){X*}else{T};
    U database[10];
    public: U& get(int index){return database[index];}
    void set(int index, T t){
        U u = convert(t);//<-- some special function
        database[index]=u;
    }
};

メモリ リーク/破損が発生している可能性があります。簡単にするために、それを無視してください。
アイデア/大まかなガイドが欲しいだけです。(完全な実行可能なコードを提供する必要はありませんが、気にしません)

実際には、20 以上の関数がMyArrayあり、多くのクラスに対して同じリファクタリングを行いたいと考えています。

編集:一部のコードとタグを (マイナー) 編集しました。AndyG と Jarod42 に感謝します。

4

2 に答える 2