- 作者: 雪山肥鱼
- 时间:20220213 18:31
- 目的: 类模板中可变参数的逐步展开
4种情况做父类
# myclasst<Args...> 继承
# myclasst<Args>... 继承
# myclasst<Args, char>... 继承
# myclasst<Aargs, Args...> 继承
myclasst<Args...> 继承
template <typename ...Args>
class myclasst {
public:
myclasst() {
cout << "myclass:myclasst()执行了,可变参数个数 =" << sizeof...(Args) << endl;
}
};
template <typename...Args>
class myclasst2 :public myclasst<Args...> {
public:
myclasst2() {
cout << "myclass:myclasst()执行了,可变参数个数 =" << sizeof...(Args) << endl;
}
};
int main(int argc, char **argv) {
myclasst2<double, float, int> tmpobj;
return 0;
}
![](https://img.haomeiwen.com/i25953572/7edf56fbcd87e336.png)
- Args是一包参数
- 子类 myclasst2 是要实例化出来的。
- 父类myclasst也会实例化出来
myclasst<Args>... 继承
template <typename ...Args>
class myclasst {
public:
myclasst() {
cout << "myclass:myclasst()执行了,可变参数个数 =" << sizeof...(Args) << endl;
}
};
template <typename...Args>
//class myclasst2 :public myclasst<Args...> {
class myclasst2 :public myclasst<Args>... {
public:
myclasst2() {
cout << "myclass:myclasst()执行了,可变参数个数 =" << sizeof...(Args) << endl;
}
};
int main(int argc, char **argv) {
myclasst2<double, float, int> tmpobj;
return 0;
}
![](https://img.haomeiwen.com/i25953572/3c88bf7bcfaa4b36.png)
实例化出4个类
- 肯定会实例化出 myclasst2<double, float, int> 一个实例。
- :public myclasst<Args>...,代表的是实例化3个类。
a) mylcasst<double>
b) myclasst<float>
c) myclasst<int>
所以对比 :public myclasst<Args...> 代表的是一个类,:public myclasst<Args>...代表的是3个类。
myclasst<Args,char>...
template <typename ...Args>
class myclasst {
public:
myclasst() {
cout << "myclass:myclasst()执行了,可变参数个数 =" << sizeof...(Args) << endl;
}
};
template <typename...Args>
//class myclasst2 :public myclasst<Args...> {
//class myclasst2 :public myclasst<Args>... {
class myclasst2 :public myclasst<Args, char>... {
public:
myclasst2() {
cout << "myclass:myclasst()执行了,可变参数个数 =" << sizeof...(Args) << endl;
}
};
int main(int argc, char **argv) {
myclasst2<double, float, int> tmpobj;
return 0;
}
![](https://img.haomeiwen.com/i25953572/8e17889bc58b4305.png)
实例化出3个类:
a) myclasst<double, char>
b) myclasst<float, char>
c) myclasst<int, char>
myclasst<Aargs, Args...> 继承
template <typename ...Args>
class myclasst {
public:
myclasst() {
cout << "myclass:myclasst()执行了,可变参数个数 =" << sizeof...(Args) << endl;
}
};
template <typename...Args>
//class myclasst2 :public myclasst<Args...> {
//class myclasst2 :public myclasst<Args>... {
//class myclasst2 :public myclasst<Args, char>... {
class myclasst2 :public myclasst<Args, Args...>... {
public:
myclasst2() {
cout << "myclass:myclasst()执行了,可变参数个数 =" << sizeof...(Args) << endl;
}
};
int main(int argc, char **argv) {
myclasst2<double, float, int> tmpobj;
return 0;
}
![](https://img.haomeiwen.com/i25953572/ae39fb9c11275751.png)
子类是double float int.
args...代表的是一包类型,double float int.(和上处的char对等)
a) myclasst<double, double, float , int>
b) myclasst<float, double, float, int>
c) myclasst<int, double, float, int>
d) 当然还会实例化出myclasst2<double,float,int>
网友评论