使用模板时允许以下内容。
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。
在继承?
时,我们可以将其后的其他参数修改为可选参数值吗?答案 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> {
};