`
cloudtech
  • 浏览: 4594415 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++ Template学习笔记之函数模板(4)——显式模板实参

 
阅读更多

在某些情况下编译器不可能推演出模板实参的类型。如笔记(2)中所举的例子,如果模板实参推演过程为同一模板实参推演出两个不同的类型,则编译器会给出一个错误,指出模板推演失败。

在这种情况下,我们需要改变模板实参推演机制,使用显式指定(explicitly specify)模板实参。模板实参被显式指定在逗号分隔的列表中,用尖括号<>括起来,紧跟在函数模板实例的名字后面。如:

template <class T>
T min5( T, T ) {/* . . . */ }
// min5( unsigned int, unsigned int ) 被实例化
min5< unsigned int >( ui, 1024 );

在这种情况下,模板实参表< unsigned int >显式地指定了模板实参的类型。第2个实参是1024,其类型是int。因为第2个函数参数的类型通过显式模板实参已被固定为unsigned int,所以第2个函数实参通过有序标准转换被转换成类型unsigned int。

在显式特化中,我们只需列出不能被隐式推演的模板实参,如同缺省实参一样,我们只能省略尾部的实参。如:

template <class T1,class T2,class T3>
T1 sum ( T2, T3) ;
// OK: T3是unsigned int,T3从ui的类型中推演出来
ui_type loc3 = sum<ui_type,char>(ch,ui);
// OK: T2是char,T3是unsigned int,T2和T3从pf的类型中推演出来
ui_type (*pf)(char,ui_type) = &sum<ui_type>;
// ERROR: 只能省略尾部的实参
ui_type loc4 = sum<ui_type , , ui_type>(ch,ui);

必须要指出,显式模板实参应该只被用在完全需要它们来解决二义性,或在模板实参不能被推演出来的上下文中使用模板实例时。

分享到:
评论

相关推荐

    C++的函数模板和类模板

    函数模板和普通函数区别结论:  函数模板不允许自动类型...  4 可以通过空模板实参列表的语法限定编译器只通过模板匹配 template void func(T x) { cout &lt;&lt; "func的值是:" &lt; T func(T x, T y) { co

    C++中函数模板的用法详细解析

    C++提供的函数模板可以更加简化这个过程。 所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个...

    C++模板函数重载规则详解

    模板函数重载匹配规则可以引用《c++ primer》中的一段话来总结: 对于一个调用,其候选函数包括所有模板实参推断成功的函数模板实例。 候选的函数模板总是可行的,因为模板实参推断会排除任何不可行的模板。 与...

    C++可变参数的函数与模板实例分析

    本文实例展示了C++可变参数的函数与模板的实现方法,有助于大家更好的理解可变参数的函数与模板的应用,具体内容如下: 首先,所谓可变参数指的是函数的参数个数可变,参数类型不定的函数。为了编写能处理不同数量...

    C++实参求值顺序

    用于测试所用版本的C++ 对实参的求值顺序,若从右到左,结果值为0,反之为-1

    测量程序编制 - python 82函数-参数(形参实参).pptx

    函数——形参实参;函数——形参实参;Python 中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递: 值传递:适用于实参类型为不可变类型(字符串、数字、元组); 引用...

    C++——有默认参数的函数.txt

    函数调用时形参从实参那里取值,so实参与形参一致,有时多次调用同一函数用同样的实参,可以直接给形参一个默认的值,这样形参不必从实参取值; 举例: 函数声明 float area(float r=6.5)//就是制定r的默认值是6.5...

    C++形参与实参的区别实例解析

    本文以实例阐述了C++中形参与实参的区别,有助于读者加深对于C++形参与实参的认识。 形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不...

    简单掌握C++中的函数模板

    1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。 函数模板的声明...

    C++学习之模板特例化

     当特例化一个函数模板时,必须为原模板中的每个模板参数都提供实参。使用关键字template后跟一个空尖括号&lt;&gt;,即template &lt;&gt;,以指出我们正在特例化一个模板。   template &lt;typename&gt;

    C++ Primer第四版【中文高清扫描版】.pdf

    16.2.2 函数模板的显式实参 540 16.3 模板编译模型 542 16.4 类模板成员 545 16.4.1 类模板成员函数 548 16.4.2 非类型形参的模板实参 551 16.4.3 类模板中的友元声明 552 16.4.4 Queue和QueueItem的友元 声明 554 ...

    Python 变量的引用-调用函数传递实参的引用

    Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器...

    c++将引用或者是指针作为函数参数实现实参的运算

    主要介绍了c++将引用或者是指针作为函数参数实现实参的运算,需要的朋友可以参考下

    VB 数组名做实参实例

    VB 数组名做实参实例 VB 数组名做实参实例 VB 数组名做实参实例

    老生常谈C++中实参形参的传递问题

    函数中参数的传递 这里说的传递当然是指 实参是如何传递给形参的啦 还挺复杂的~~~~~~~~⊙﹏⊙b汗,这里讲述了4种参数传递的情况和注意事项: 1.非引用形参 这是最普通,也是最简单的形参传递了。 参数传递,即是使用...

    [Visual.C++.2010入门经典(第5版)].Ivor.Horton.part1

    1.4.1 学习c++ 4 1.4.2 c++标准 5 1.4.3 属性 5 1.4.4 控制台应用程序 5 1.4.5 windows编程概念 6 1.5 集成开发环境简介 7 1.5.1 编辑器 8 1.5.2 编译器 8 1.5.3 链接器 8 1.5.4 库 8 1.6 使用ide 8 1.6.1 工具栏...

    C++中模板类型的类型形参与实参的转换

    在用实参调用模板函数的时候,一般不会转换实参以匹配已有的实例化,而是会通过模板函数产生新的实例以适应该实参。  例如:template &lt;typename&gt; int compare(const T& v1,const T& v2) short s1,s2; int i1,...

    《C语言学习笔记》函数1

    (2)实参可以是任意合法的常量、变量、表达式 (3)实参与形参个数一致,类型一致(可能会发生类型转换),顺序一致 (1)自定义函数必须先定义后调用(2)库函数调

    深入理解C++11:C++11新特性解析与应用

    402.10 final/override控制 442.11 模板函数的默认模板参数 482.12 外部模板 502.12.1 为什么需要外部模板 502.12.2 显式的实例化与外部模板的声明 522.13 局部和匿名类型作模板实参 542.14 本章小结 55第3章 通用为...

    C语言 编写函数,由实参传来一个字符串,统计其中字母,数字空格,和其他字符的个数

    编写函数,由实参传来一个字符串,统计其中字母,数字空格,和其他字符的个数

Global site tag (gtag.js) - Google Analytics