如何在不创建空类的情况下避免"big"模板类的专用化?

How to avoid specialization for a "big" template class without creating an empty class?

本文关键字:big 专用 情况下 创建      更新时间:2023-10-16

给定以下条件:

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-的分部类,那么我必须这样专门化:

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;

您可以将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;
}

有关工作示例,请参见此处。

EDIT:或者,您可以将boost::tuple或std::tuble与C++11一起使用:)

如果您的编译器支持C++11模板别名,那么做起来很简单:

template <typename T, typename U>
using tuple2 = tuple<T,U,NullType,NullType,NullType>;