如何在不创建空类的情况下避免对"大"模板类进行专门化?

JAN*_*JAN 4 c++ templates

鉴于以下内容:

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

};
Run Code Online (Sandbox Code Playgroud)

我想创建一个只有两个int-s 的部分类,然后我必须像这样专门化:

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;
        }
};
Run Code Online (Sandbox Code Playgroud)

但是这个实现需要我做:

Tuple<int,int,NullType,NullType,NullType> b;
Run Code Online (Sandbox Code Playgroud)

所以这很丑啊:)

有没有另一种方法来实现部分特化而不定义另一个(空)类,所以我可以这样做:Tuple<int,int> b1;

Mor*_*itz 7

您可以通过T4默认模板参数创建T2并使用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;
}
Run Code Online (Sandbox Code Playgroud)

请看这里的工作示例.

编辑:或者,你可以使用boost :: tuple或std :: tuple与C++ 11 :)

  • 如果使用C++ 11,[std :: tuple](http://en.cppreference.com/w/cpp/utility/tuple)是内置的,可能更受欢迎. (3认同)