美文网首页
类模板中可变参数的逐步展开

类模板中可变参数的逐步展开

作者: 404Not_Found | 来源:发表于2022-02-13 08:05 被阅读0次
  • 作者: 雪山肥鱼
  • 时间: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;
}
图片.png
  1. Args是一包参数
  2. 子类 myclasst2 是要实例化出来的。
  3. 父类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;
}
图片.png

实例化出4个类

  1. 肯定会实例化出 myclasst2<double, float, int> 一个实例。
  2. :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;
}
图片.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;
}
图片.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>

相关文章

  • ★10.关于可变参数模板

    可变参数函数模板 可变参数类模板 可变参数函数模板的使用 转发参数包

  • c++11: 可变参数模板

    c++11 可变参数模板,模板函数可以表示0到任意个数、任意类型的参数。但是,要提取模板中的参数,则需要不断的展开...

  • C++拾遗

    可变参数模板函数 省略号的作用 声明一个参数包,可包含0到任意个模板参数 在模板定义的右边,可将参数包展开成各个独...

  • C++ 泛型编程(一) —— 可变参数模板

    可变参数模板函数 可变参数模板是 C++ 11 中引入的一个新特性,它允许我们定义一个可以接受可变数目参数的模板函...

  • 现代c++笔记(4)

    可变参数模版 谈的模板包含类模板,函数模板 变化的是模板参数参数个数以及类型是变化的,通过逐渐递减参数个数来实现递...

  • 模板与泛型 —— 可变参模板

    一、可变参函数模板 二、可变参类模板 C++ 11 中引入了 可变参模板 (Variadic Template):...

  • 【C++ Templates(4)】可变参数模板

    可变参数模板示例 重载可变参数和非可变参数模板 上例也可以如下实现,如果两个函数模板只有尾置参数包不同,会优先匹配...

  • C++11特性

    一、可变参数模板(Variadic Templates) 一、匿名函数(Lambda表达式) 二、可变模板参数 三...

  • 04 可变模板参数

    可变参数模板示例 重载可变参数和非可变参数模板 前一例子也可以如下实现,如果两个函数模板只有尾置参数包不同,会优先...

  • 4/10

    1.模板非类型参数实现可变参数长度的模板数组如:template中int n为非类型参数...

网友评论

      本文标题:类模板中可变参数的逐步展开

      本文链接:https://www.haomeiwen.com/subject/mqfqlrtx.html