模板增强

日期:2019-11-09编辑作者:关于计算机

C++11/14学习(五)模板增强,14模板

外部模板

传统 C++ 中,模板只有在使用时才会被编译器实例化。
换句话说,只要在每个编译单元(文件) 中编译的代码中遇到了被完整定义的模板,都会实例化。
这就产生了重复实例化而导致的编译时间的增加。
并且,我们没有办法通知编译器不要出发模板实例化。

C++11 引入了外部模板,扩充了原来的强制编译器在特定位置实例化模板的语法,
使得能够显式的告诉编译器何时进行模板的实例化:

template class std::vector<MagicClass>;        // 强行实例化
extern template class std::vector<MagicClass>; // 不在该编译文件中实例化模板

尖括号 ">"

在传统 C++ 的编译器中, >> 一律被当做右移运算符来进行处理。
但实际上我们很容易就写出了嵌套模板的代码:

std::vector<std::vector<int>> mtx;

这在传统C++编译器下是不能够被编译的

C++11 开始,连续的右尖括号将变得合法,并且能够顺利通过编译。
甚至于下下面这种写法都能够通过编译:

template<bool T> SuckType;
std::vector<SuckType<(1 > 2)>> v; // 合法, 但不建议写出这样的代码

类型别名模板

在了解类型别名模板之前,需要理解『模板』 和『类型』 之间的不同。
仔细体会这句话:模板是用来产生类型的。
在传统 C++中, typedef 可以为类型定义一个新的名称,但是却没有办法为模板定义一个新的名称。
因为,模板不是类型。例如:

template<typename T, typename U>
class SuckType;
typedef SuckType<std::vector, std::string> NewType; // 不合法

C++11 使用 using 引入了下面这种形式的写法,并且同时支持对传统typedef 相同的功效:

typedef int(*process)(void *);
using process = void(*)(void *); // 同上, 更加直观
using NewType = SuckType<std::vector, std::string>;

变长参数模板

在 C++11 之前,无论是类模板还是函数模板,都只能按其指定的样子,接受一组固定数量的模板参数;
而 C++11 加入了新的表示方法,允许任意个数、任意类别的模板参数,
同时也不需要再定义时将参数的个数固定。

template<typename... Ts> class Magic;
class Magic<int,
    std::vector<int>,
    std::map<std::string,
    std::vector<int>>> darkMagic;

既然是任意形式,所以个数为0的模板参数也是可以的:
class Magic<> nothing;

如果不希望产生的模板参数个数为0,可以手动的定义至少一个模板参数:

template<typename Require, typename... Args> class Magic;

外部模板 传统 C++ 中,模板只有在使用时才会被编译器实例化。 换句话说,只要在每个编译单元(文件...

本文由今晚最快开奖现场直播发布于关于计算机,转载请注明出处:模板增强

关键词:

Shell脚本监察和控制网址页面平常打开状态,巧用

Nginx静态文件管理技能是超级屌的,我们能或不可能越发优化呢?静态文件的读取,会消耗IO财富。能够设想把静态文...

详细>>

无线网卡驱动总结,无线网卡的安装

系统:CentOS6.6 驱动:hybrid-portsrc_x86_32-v5_100_82_112.tar.gz   1.下载驱动布罗兹com有线网卡驱动   2.安装驱动程序 [root@lo...

详细>>

重写规则

.htaccess 规则 重写准则 Introduction 介绍 文件名 .htaccess 属性 644 (RW-R–R–) htaccess会影响它所在目录下的全数子目录 留意...

详细>>

在Linux防火墙上编译Apache

目标: 一台Redhat linux 6.2 用为防火墙,专线连结Chinanet,对内连结     局域网段192.168.11.0/24,需求enable PHP4和Mysql数据库...

详细>>