C++——模板
1.参数类型
template <typename T> void f1(T&);//实参必须是左值
f1(i);//对
f1(ci);//对,T的类型是const int
f1();//错
template <typename T> void f2(const T&);//实参可以是左值,const右值
f2(i);//对
f2(ci);//对
f2();//对
template <typename T> void f3(T&&);//实参只能是非const右值
2.右值引用参数的模版函数
template <typename T> void f3(T&& val)
{
T t=val;//拷贝还是绑定一个引用?
t=fcn(t);//赋值只改变t还是t和val都变?
if (val == t)//若t是引用类型,则一直为true
……
}
//看传入的值
.如果传入值是右值,如字面常量,T为int。此时t的类型也为int,通过val初始化,参数val保持不变
.如果传入值是左值,T为int&???此时t的类型也为int&,则变t也变val
3.标准库的move
template <typename T> typename remove_reference<T>::type&& move(T&& t)
{
return static_cast<typename remove_reference<T>::type&&>(t);
}
std::move (string("bye!"))执行过程:
- 推断T的类型为string
- remove_reference用string实例化
- remove_reference<string>的type成员是string
- move的返回类型是string&&
- move的函数参数t的类型为string&&
4.转发的类型保持
template <typename F, typename T1, typename T2> void flip1(F f,T1 t1,T2 t2)
{
f(t2,t1);
}
void f(int v1, int &v2)
{
}
//
f(,i)
flip1(f,j,);//没有发挥引用的效果
解决办法:模版类型参数是右值引用,对应实参的const属性和左右值属性得到保持。为什么?引用折叠。
template <typename F, typename T1, typename T2> void flip1(F f,T1&& t1,T2&& t2)
{
f(t2,t1);
}
还有个问题:
flip(g,i,42);//不能从一个左值实例化int &&
解决办法:
template <typename F, typename T1, typename T2> void flip1(F f,T1&& t1,T2&& t2)
{
f(std::forward<T2>(t2),std::forward<T1>(t1));//显式模版实参类型
}
4.模版重载
//1.
template <typename T> string debug_rep(const T& t)
{
stream ret;
ret<<t;
return ret.str();
}
//2.
template <typename T> string debug_rep(T* p)
{
stream ret;
ret<<"pointer is: "<<p;
if (p)
ret<<" "<<debug_rep(*p);
else
ret<<" null ptr"<<;
return ret.str();
}
//调用
string s("hi");
cout<<debug_rep(s)<<endl;//只有第一个版本可行
cout<<debug_rep(&s)<<endl;//第一个版本实例化为:debug_rep(const string*&), T类型为string*
//第二个版本实例化为:debug_rep(string*),T类型为string 更精确,编译器选择第二个 const string *sp=&s;
cout<<debug_rep(sp)<<endl;//第一个版本实例化为:debug_rep(const string*&), T类型为string*
//第二个版本实例化为:debug_rep(const string*),T类型为const string,更特列化,选择第二个
一个非函数模版和一个函数模版都能提供同样的匹配时,编译器选择非函数模版。
多个函数模版提供同样的匹配时,编译器选择最特例化的那个。
5.可变函数模版
template <typename T, typename ... Args> viod foo(const T& t, const Args& ... rest)
{
cout<<sizeof...(Args)<<endl;//类型参数的数目
cout<<sizeof...(rest)<<endl;//函数参数的数目
}
//
int i=; double d=3.14; string s="stringiest ";
foo(i,s,,d); //参数包有3个参数
foo(s,,"hi"); //参数包有2个参数
foo(d,s); //参数包有1个参数
foo("hi"); //参数包有0个参数
//实例化版本
void foo(const int&, const string&, const int&, const double&);
void foo(const string&, const int&, const char[]&);
void foo(const double&, const string&);
void foo(const char[]&);
递归调用:必须声明一个非可变参数版本,否则无限递归
template<typename T> ostream &print(ostream &os, const T& t)//打印最后一个元素
{
return os<<t;
}
template <typename T, typename... Args> ostream &print(ostream& os, const T& t, const Args&... rest)
{
os<<t<<",";
return print(os, rest ...);//递归调用
}
5.1 扩展
5.2 转发(forward)
6.模版特例化:本质上实例化一个模板,而不是重载,不影响函数匹配
template <typename T> int compare(const T&, const T&);
template <size_t N, size_t M> int compare(const char (&)[N],const char (&)[M]);
const char* p1="hi",*p2="mom";
compare(p1,p2);//调用第一个版本
compare("hi","mom");//调用两个版本 template <> int compare(const char* const &p1, const char* const &p2)
{
return strcmp(p1,p2);
}
//此特例化,是为了处理字符指针,而不是数组
模版及其特例化版本应声明在同一个头文件中,同名模版的声明应放在前面,然后是这些模版的特例化版本。
6.1 类模板特列化
6.2 类模板部分特列化
C++——模板的更多相关文章
- Jade模板引擎让你飞
写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...
- ABP入门系列(2)——通过模板创建MAP版本项目
一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...
- CMS模板应用调研问卷
截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- OpenCV模板匹配算法详解
1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...
- 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定
一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...
- ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案
好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...
- ThinkPHP 模板substr的截取字符串函数
ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...
- DDD领域驱动设计 - 设计文档模板
设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...
随机推荐
- (60)c# com com+ dcom
一.创建COM组件 1.创建项目 2.设置使程序集可见 AssemblyInfo.cs中flase改为ture 或者 项目属性 设置可见 3.Guid生成器 在开始程序下能够找到Guid生成器 每次都 ...
- Iconv作用以及安装问题解决
当我们在使用Window操作系统的时候,可能使用最多的文本格式就是txt了,但是当我们将Window平台下的txt文本文档拷贝到Linux平台下查看时,发现原来的中文全部变成了乱码.没错, 引起这个结 ...
- 【转载 | 翻译】Visualizing A Neural Machine Translation Model(神经机器翻译模型NMT的可视化)
转载并翻译Jay Alammar的一篇博文:Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models Wi ...
- SimpleDateFormat 格式化时间少了12个小时
SimpleDateFormat 格式化时间少了12个小时 标签(空格分隔): java SimpleDateFormat H:一天中的小时数:0-23 h: am/pm 小时数: 1-12 publ ...
- grep与egrep命令
greo -E 等同于 egrep grep常用两种方式 1. grep -c python a.txt 2. cat a.txt | grep -c python a.txt文件如下 i l ...
- 第五节 RabbitMQ在C#端的应用-消息收发
原文:第五节 RabbitMQ在C#端的应用-消息收发 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/873 ...
- java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC 企业站源码
前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...
- JavaScript常用技巧之进制转换
一.十进制转二进制 (8).toString(2) 二.二进制转十进制 parseInt("1000",2) 三.获取当前时间戳 // 方法 Date.now() // 对象和操作 ...
- SpringMvc返回给前端数据@ResponseBody响应体【支持Ajax】
1).在Controller中写 //@ResponseBody响应体是jackson包提供的 用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格 ...
- ERROR 2003 (HY000): Can't connect to MySQL server on '129.28.149.240' (111) mysql 无法远程连接
环境: ubuntu mysql 一. 查看端口 可以看到mysql监控的是本机Ip root@jiang:/etc/mysql/mysql.conf.d# netstat -apn|grep 33 ...