修复模板参数的值

时间:2013-01-24 06:06:05

标签: c++ templates

使用模板时允许以下内容。

template <typename PAR1 = X,
          typename PAR2 = Y,
          typename PAR3 = Z>
class Base {
   //some stuff inside
};

template <typename PAR1
          typename PAR2 = Z>
class Derived : public Base <PAR1,Y,PAR2> {
   //some stuff here
};

我想要的是Derived类应该始终将PAR2类型设为Y。

在继承?

时,我们可以将其后的其他参数修改为可选参数值吗?

2 个答案:

答案 0 :(得分:1)

我希望你想要这样的东西。所以,有可能

class X{};
class Y{};
class Z{};

template <typename PAR1 = X,
          typename PAR2 = Y,
          typename PAR3 = Z>
class Base {
   //some stuff inside
};

template <typename PAR1, typename PAR3>
class Derived : public Base <PAR1,Y,PAR3> {
};

int main()
{
    Derived<X, Z> d;
}

编辑2: 虽然与OP无关,但最好知道在部分特化中,部分专用类模板参数具有主模板的默认值

class X{};
class Y{};
class Z{};

template <typename PAR1 = X, typename PAR2 = Y, typename PAR3 = Z>
class Base {
public:
    void f() {
        std::cout << typeid(PAR1).name() << " " << typeid(PAR2).name() << " " << typeid(PAR3).name() << std::endl;
        std::cout << 1;
    }
};

template<typename PAR2, typename PAR3> class Base<X, PAR2, PAR3>
{
public:
    void f() {
        // PAR2 is by default Y and PAR3 is by default Z
        std::cout << typeid(PAR2).name() << " " << typeid(PAR3).name() << std::endl;
        std::cout << 2;
    }
};

int main()
{
    Base<X> b;   // instantiation of partially specialized template
    b.f();
}

答案 1 :(得分:1)

我猜你对模板默认值和部分特化感到困惑。因为Base使用默认值获取3个参数,所以可以使用0到3个参数实例化Base。

Base<> b1;              #1, PAR1=X,   PAR2=Y,   PAR3=Z
Base<int> b2;           #2  Par1=int, PAR2=Y,   PAR3=Z
Base<int, int> b3;      #3  PAR1=int, PAR2=int, PAR3=Z
Base<int, int, int> b4; #4  PAR1=int, PAR2=int, PAR3=int 

在Derived类中,您继承的情况#4当然是有效的。

所以你可以从上面任何形式的Base继承。

基本模板参数可以是独立类型(值),也可以从template <typename PAR1, typename PAR2 = Y>

传递
template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <> {
};

OR

template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <PAR1> {
};

OR

template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <PAR1, PAR2> {
};