4

次の場合:

template <typename T0,typename T1,typename T2 , typename T3 , typename T4>
class Tuple
{
private:
    T0 v0;
    T1 v1;
    T2 v2;
    T3 v3;
    T4 v4;

public:
    void f()
    {
        cout << v0 << "," << v1 << "," << v2 << "," << v3 << "," << v4 << endl;
    }

};

int-sが2つしかない部分クラスを作成したい場合は、次のように特殊化する必要があります。

class NullType { };  // create an empty class
template <typename T0, typename T1>
class Tuple<T0,T1,NullType,NullType,NullType >
{
    private:
        T0 v0;
        T1 v1;
    public:
        void func()
        {
            cout << "i'm a specialization" << endl;
        }
};

しかし、この実装では、次のことを行う必要があります。

Tuple<int,int,NullType,NullType,NullType> b;

かなり醜いです:)

別の(空の)クラスを定義せずに部分的な特殊化を実装する別の方法はありTuple<int,int> b1;ますか?

4

2 に答える 2

7

T2からT4のデフォルトのテンプレート引数を作成voidし、空のNullTypeクラスの代わりに使用できます。例:

template <typename T0,typename T1,typename T2=void , typename T3=void , typename T4=void> class Tuple { private:
    T0 v0;
    T1 v1;
    T2 v2;
    T3 v3;
    T4 v4;

public:
    void f()
    {
        cout << v0 << "," << v1 << "," << v2 << "," << v3 << "," << v4 << endl;
    }

};

template <typename T0, typename T1> class Tuple<T0,T1,void,void,void > {
    private:
        T0 v0;
        T1 v1;
    public:
        void func()
        {
            cout << "i'm a specialization" << endl;
        } };

int main(int argc, char** argv) {
    Tuple<int,int> myTuple;
    myTuple.func(); 
    return 0;
}

実例についてはこちらをご覧ください。

編集:または、 C++11でboost::tupleまたはstd::tupleを使用できます:)

于 2012-08-27T12:56:53.777 に答える
2

コンパイラがC++11テンプレートエイリアスをサポートしている場合、これは非常に簡単です。

template <typename T, typename U>
using tuple2 = tuple<T,U,NullType,NullType,NullType>;
于 2012-08-27T13:21:29.953 に答える