定义:从函数实参确定模板实参的类型和值的过程叫做模板实参推断 《C++ Primer 4th》
举例
template<class Glorp>//模板类型形参
int compare(const Glorp& v1,const Glorp& v2)//函数形参
{
if(v1<v2)
{
return -1;
}
if(v2<v1)
{
return 1;
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
compare(1,0);//未显式指定模板参数类型,所以参数推导机制起作用
compare(3.14,2.7);
return 0;
}
模板实参推断的规则:
1)如果某个函数的多个形参的类型是同一个模板类型形参,推断出来的函数的这些实参类型要完全匹配
以下调用代码会导致如下错误:
Error 1 error C2782: 'int compare(const Glorp &,const Glorp &)' : template parameter 'Glorp' is ambiguous
short i=0;
int j=3;
compare(i,j);
2)如果模板函数的形参是非引用类型,忽略const
以下调用代码正确:
template<class A>
void Fobj(A a)
{
cout<<a<<endl;
}
nt _tmain(int argc, _TCHAR* argv[])
{
const int x=9;
Fobj(x);
return 0;
}
3)形参如果是const 引用或者指针,实参可以使非const引用或者指针,编译器会自动转换到const
4)非引用类型模板形参可以将数组或函数类型的实参转换成数组指针或函数指针
5)引用类型模板形参不能将将数组或函数类型的实参转换成数组指针或函数指针,参数推导将出错
6)可以根据函数指针推断模板实参
例如:
template <typename T> int compare (const T& ,const T&);
int (*pf1) (const int&,const int&)=compare;
7)模板实参推断顺序是从函数返回值开始,从左至右逐一推导
8)为防止推导失败,可以在调用函数时显式指定模板参数类型
分享到:
相关推荐
候选的函数模板总是可行的,因为模板实参推断会排除任何不可行的模板。 与往常一样,可行函数(模板与非模板)按类型转换 (如果对此调用需要的话)来排序。当然,可以用于函数模板调用的类型转换是非常有限的。 ...
16.2.1 模板实参推断 537 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和...
16.2.5 模板实参推断和引用 608 16.2.6 理解std::move 610 16.2.7 转发 612 16.3 重载与模板 614 16.4 可变参数模板 618 16.4.1 编写可变参数函数模板 620 16.4.2 包扩展 621 16.4.3 转发参数包 622...
16.2.5 模板实参推断和引用 608 16.2.6 理解std::move 610 16.2.7 转发 612 16.3 重载与模板 614 16.4 可变参数模板 618 16.4.1 编写可变参数函数模板 620 16.4.2 包扩展 621 16.4.3 转发参数包 622...
VB 变量做实参举例 VB 变量做实参举例
VB 数组元素做实参实例 VB 数组元素做实参实例 VB 数组元素做实参实例
VB 数组名做实参实例 VB 数组名做实参实例 VB 数组名做实参实例
61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61.java实参.zip61....
本文档是一个实参形参影响的程序的调试过程及结果,可以帮助更好的理解函数实参与形参关系
VB6.0把常量作为实参方法示例,书中的代码,分享给大家,后附完整源码下载。 Sub s(n As Integer) '定义子过程 Dim i As Integer For i = 1 To n '子过程的功能是输出n个空格 Print " "; Next i End Sub...
C什么叫实参 形参 ?怎么用?区别?
简单描述了构造函数与析构过程。中间有示例。 感兴趣的朋友可以下来试试。
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和...
函数模板和普通函数区别结论: 函数模板不允许自动类型... 4 可以通过空模板实参列表的语法限定编译器只通过模板匹配 template void func(T x) { cout << "func的值是:" < T func(T x, T y) { co
VB 常量做实参举例 VB 常量做实参举例
C语言看不懂形参实参以及调用方法的必看PPT课件.pptx
传递实参.html
在用实参调用模板函数的时候,一般不会转换实参以匹配已有的实例化,而是会通过模板函数产生新的实例以适应该实参。 例如:template <typename> int compare(const T& v1,const T& v2) short s1,s2; int i1,...
编写函数,由实参传来一个字符串,统计其中字母,数字空格,和其他字符的个数
用实际代码的形式阐述了ByVal和ByRef的区别以及形参和实参的区别。 源码在VB.net 2010下调试通过。 欢迎指正!