【C++】C++11可变参数模板(函数模板、类模板) 您所在的位置:网站首页 可变参数类型有哪些 【C++】C++11可变参数模板(函数模板、类模板)

【C++】C++11可变参数模板(函数模板、类模板)

2024-07-10 08:19| 来源: 网络整理| 查看: 265

在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。

可变参数模板

可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...:

template

其中,...可接纳的模板参数个数是0个及以上的任意数量,需要注意包括0个。

若不希望产生模板参数个数为0的变长参数模板,则可以采用以下的定义:

template

本质上,...可接纳的模板参数个数仍然是0个及以上的任意数量,但由于多了一个Head类型,由此该模板可以接纳1个及其以上的模板参数。

函数模板的使用

在函数模板中,可变参数模板最常见的使用场景是以递归的方法取出可用参数:

void print() {} template void print(const T& firstArg, const Types&... args) { std::cout std::cout print(2, "hello", 1); return 0; }

现在有一个模板函数接纳一个参数加上可变参数,还有一个模板函数直接接纳可变参数,如果调用print(2, “hello”, 1),会发现这两个模板函数的参数格式都符合。是否会出现冲突、不冲突的话会执行哪一个呢?

运行代码后的结果为:

yngzmiao@yngzmiao-virtual-machine:~/test/$ ./main 2 2 hello 1 1 0

从结果上可以看出,程序最终选择了一个参数加上不定参数的模板函数。也就是说,当较泛化和较特化的模板函数同时存在的时候,最终程序会执行较特化的那一个。

再比如一个例子,std::max函数只可以返回两个数的较大者,如果多个数,就可以通过不定参数的模板来实现:

#include template T my_max(T value) { return value; } template T my_max(T value, Types... args) { return std::max(value, my_max(args...)); } int main(int argc, char *argv[]) { std::cout typedef tuple inherited; public: tuple() {} tuple(Head v, Tail... vtail) : m_head(v), inherited(vtail...) {} Head& head() {return m_head;} inherited& tail() {return *this;} protected: Head m_head; }; int main(int argc, char *argv[]) { tuple t(1, 2.3, "hello"); std::cout std::tuple t2(1, 2.3, "hello"); std::get(t2) = 4; // 修改tuple内的元素 std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有