泛化之美

您所在的位置:网站首页 anki怎么使用模板 泛化之美

泛化之美

2023-05-27 00:08| 来源: 网络整理| 查看: 265

image

目录概述可变模板的参数展开可变参数函数模板递归函数方式展开参数包逗号表达式展开参数包可变参数类模板模板偏特化和递归方式来展开参数包继承方式展开参数包可变参数模板消除重复代码可变参数模板实现泛化的delegate总结

概述

首先这篇文章出自博客园作者:[ 🔗 qicosmos ],我对本文的实例代码进行了学习、思考和整理纠正,理清了文章的全部细节,觉得这是一篇让我受益匪浅的文章。之所以会接触「可变参数模板」这部分的内容,是因为我当下刚好在学C++11 function机制,其内部实现需要接收不定长度的参数,因此需要用到「可变参数模板」相关的知识。本文有很多的C++模板元编程「黑魔法」是我之前从来没接触过的,比如模板递归展开、类型萃取type_traits中的基石integral_constant等等。C++的学习之路任重而道远呀,那废话不多说,我们来说说今天的主题,C++11的可变参数模板。

C++11的新特性「可变参数模板(variadic templates)」是C++11新增的「最强大」的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模板和函数模板中只能含固定数量的模板参数,可变模板参数无疑是一个巨大的改进。然而由于可变模板参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一。虽然掌握可变参数模板有一定难度,但是它却是C++11 中最有意思的一个特性,本文希望带领读者由浅入深的认识和掌握这一特性,同时也会通过一些实例来展示可变参数模板的一些用法。

可变模板的参数展开

可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号「...」。比如我们常常这样声明一个可变模板参数:template或者template,一个典型的可变模板参数的定义是这样的:

template void f(T... args);

上面的可变模板参数的定义当中,省略号的作用有两个:

声明一个参数包T... args,这个参数包中可以包含0到任意个模板参数; 在模板定义的右边,可以将参数包展开成一个一个独立的参数。

上面的参数args「前面」有省略号,所以它就是一个可变模板参数,我们把带省略号的参数称为“参数包”,它里面包含了0到N(N>=0)个模板参数。我们无法直接获取参数包args中的每个参数的,只能通过「展开参数包」的方式来获取参数包中的每个参数,这是使用可变模板参数的一个「主要特点」,也是「最大的难点」,即如何展开可变模板参数。

可变模板参数和普通的模板参数语义是一致的,所以可以应用于函数和类,即「可变参数模板函数」和「可变参数模板类」,然而,模板函数不支持偏特化,所以可变参数模板函数和可变参数模板类展开可变参数的方法还不尽相同,下面我们来分别看看他们展开可变参数的方法。

可变参数函数模板

一个简单的可变参数函数模板:

#include using namespace std; template void f(T... args) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3