首页 > 编程语言 >C++模板的哲学

C++模板的哲学

时间:2022-09-27 11:56:03浏览次数:51  
标签:std 编译器 C++ 编译 哲学 实例 模板

2.5 模板

C++ 的模板一直是这门语言的一种特殊的艺术,模板甚至可以独立作为一门新的语言来进行使用。模板的哲学在于将一切能够在编译期处理的问题丢到编译期进行处理,仅在运行时处理那些最核心的动态服务,进而大幅优化运行期的性能。因此模板也被很多人视作 C++ 的黑魔法之一。

 

外部模板

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

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

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

 

尖括号 ">"

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

std::vector<std::vector<int>> matrix;

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

template<bool T>
class MagicType {
    bool magic = T;
};

// in main function:
std::vector<MagicType<(1>2)>> magic; // 合法, 但不建议写出这样的代码

[原文出处 https://github.com/changkun/modern-cpp-tutorial/blob/master/book/zh-cn/02-usability.md#25-%E6%A8%A1%E6%9D%BF]

标签:std,编译器,C++,编译,哲学,实例,模板
From: https://www.cnblogs.com/Andrewz/p/16734062.html

相关文章

  • 界面组件DevExpress WinForms v22.1 - 全新升级的HTML CSS 模板
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office......
  • shopify capital主题模板配置修改
    shopifycapital主题有风格和精确地展示产品,这个主题非常适合编辑内容,优化了更长的文本部分,以支持品牌的故事叙述;高容量商店,专为在特定时期处理大量交易的商店设计  ......
  • 学习笔记-C++ STL篇
    1、C++中vector作为参数的三种传参方式(传值&&传引用&&传指针)https://blog.csdn.net/weixin_47641702/article/details/113522865c++中常用的vector容器作为参数时,有......
  • 「浙江理工大学ACM入队200题系列」问题 J: 零基础学C/C++83——宁宁的奥数路
    本题是浙江理工大学ACM入队200题第八套中的J题我们先来看一下这题的题面.题面题目描述宁宁参加奥数班,他遇到的第一个问题是这样的:口口口+口口口=口口口,宁宁需要将1~9......
  • c++基础入门自学笔记总结4---通讯录管理系统
    没过几天通讯录也终于做完了,今天就为我们近三个星期的c++初级学习画上一个完美的句号吧系统需求通讯录是一个可以记录亲人、好友信息的工具。本教程主要利用C++来实现......
  • C++11
    1.新增不需要赋值即可初始化//C++98inta=1;int*p1=newint[3];Dated1(2022,9,26);//C++11Dated2{2022,9,27};int*p2=......
  • Flask学习笔记(三)-jinja2 模板入门
    一、表达式jinja2是一个被广泛使用的模板引擎,其设计思想源自于django模板引擎,jinja2扩展了语法,增加了强大的功能,被flask选为内置的模板语言示例的目录结构如下./├─......
  • C++多线程编程之【线程管理】
    1.如何启动线程?构建std::thread对象即可。直接传函数名(地址)创建一个类并创建伪函数。构建对象(实例化),将对象作为参数传入thread对象实例化。2.为什么要等待线程?首先......
  • C/C++ __cdecl和__stdcall的区别和联系
    函数的调用约定涉及了函数参数的入栈顺序、清栈主体(负责清理栈的主体:函数自身还是调用函数者?)、部分名称重整。如,在C编译方式下有_stdcall、_cdecl等调用约定,在C++编译方式......
  • C/C++ x86-64的调用约定,忽略__stdcall、__cdecl、__fastcall、_thiscal
    在设计调用约定时,x64体系结构利用机会清除了现有Win32调用约定(如__stdcall、__cdecl、__fastcall、_thiscall等)的混乱。在Win64中,只有一个本机调用约定而__cdecl......