首页 > 编程语言 >[c++11新特性]02-模板优化

[c++11新特性]02-模板优化

时间:2022-12-06 16:33:25浏览次数:35  
标签:11 02 typedef c++ 编译器 实例 C++ 模板

模板优化

  • ​模板优化​
  • ​​模板别名​​
  • ​​默认模板参数​​
  • ​​外部模板​​

模板别名

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

template<typename T,typename U>
class MagicType{
public:
T dark;
U magic;
};

// 不合法
template<typename T>
typedef MagicType<std::vector<T>, std::string> FakeDarkMagic;

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

通常我们使用 typedef 定义别名的语法是:typedef 原名称 新名称;,但是对函数指针等别名的定义语法却不相同,这通常给直接阅读造成了一定程度的困难。

typedef int(*process)(void*);
using NewProcess=int(*)(void*);

template<typename T>
using TrueDarkMagic = MagicType<std::vector<T>, std::string>;

int main()
{
TrueDarkMagic<bool> you;
}

默认模板参数

我们定义了一个加法函数:

template<typename T,typename U>
auto add(T x, U y)->decltype(x+y)
{
return x+y;
}

但在使用时发现,要使用 add,就必须每次都指定其模板参数的类型。在 C++11 中提供了一种便利,可以指定模板的默认参数:

template<typename T =int,typename U =int>
auto add(T x, U y)->decltype(x+y)
{
return x+y;
}

外部模板

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

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

template class std::vector<bool>;// 强行实例化
extern templateclass std::vector<double>;// 不在当前编译文件中实例化模板

标签:11,02,typedef,c++,编译器,实例,C++,模板
From: https://blog.51cto.com/u_6650004/5916376

相关文章

  • [c++11新特性]07-可变参模板
    可变参模板​​可变参数模板​​​可变参模板​​​简介​​​​递归模板函数​​简介可变参模板是c++11引入的特别重要的一个特性,和c语言中的可变参一样,也是使用...来......
  • NCTF-2022-pwn-ezlink
    NCTF-2022-pwn-ezlink总结利用_IO_obstack_file结构体进行攻击时,最好打_IO_2_1_stdin_利用_IO_obstack_file结构体进行攻击时,栈迁移布置如下:gg1=libc.search(asm......
  • MBR40200PT-ASEMI插件肖特基二极管MBR40200PT
    编辑:llMBR40200PT-ASEMI插件肖特基二极管MBR40200PT型号:MBR40200PT品牌:ASEMI封装:TO-247正向电流:40A反向电压:200V引线数量:3芯片个数:2芯片尺寸:130MIL漏电流:10ua恢复时间:5ns浪......
  • sb3.0+polaris-server(北极星) 20221206
    1、polaris-server(北极星)安装(windows版本) 1)、安装前准备    安装golanggolang官网:https://golang.google.cn/golang下载地址:https://golang.google.cn/dl/......
  • C++ 之 cout 格式化输出
    写代码时每次用到格式化输出就各种搜来搜去,今天好好整理一下,方便以后查阅和使用。参考链接:C++之cout使用攻略C++格式化输出首先,加上头文件#include<iomanip>,......
  • W11中使用VScode远程开发之宝塔用户自动登录
    宝塔面板开启ssh,加密方式选择rsa下载秘钥,放值目录:C:\Users\本机用户\.ssh修改该目录下的config文件Host111.112.113.114HostName111.112.113.114UserrootF......
  • UEC++ 会话暴露给蓝图 ,无法识别会话相关类型
    在实在联网功能时,我们常常需要获取到会话类型,当我们需要在蓝图中使用这些类型的时候。如果我们直接在头文件中直接使用会话相关类型在编译时就会报错Unrecognizedtype......
  • Oracle错误——ORA-03113:通信通道的文件结尾 解决办法
    该错误我是还原数据库之后出现的建议的问题跟进方法是先查看oracle的日志,查看的方法select*fromv$diag_info 先看日志文件存储在哪,根据路径找到文件查看文件内容......
  • C/C++饮品自动贩卖机系统
    C/C++饮品自动贩卖机系统该饮品自动贩卖机总容量确定,且贩卖机内通道宽度并排只能容纳一个饮品,购买饮品出口和添加饮品口在同一个位置。经营者添加饮品时,每次只能添加一个......
  • C++校园导游程序及通信线路设计
    C++校园导游程序及通信线路设计一、设计内容:设计校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相......