模板实参推断

 

定义

从函数调用获得的实参确定模板实参的类型和值的过程叫做模板实参推断 《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)模板函数的多个形参的类型是同一个模板类型形参,推断出来的函数的这些实参类型要完全匹配

以下调用代码会导致如下错误:

short i=0;
 int j=3;
 compare(i,j);
Error 1 error C2782: 'int compare(const Glorp &,const Glorp &)' : template parameter 'Glorp' is ambiguous


 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) 实参是数组或函数的

1.非引用类型模板形参

 可以自动转换成数组指针或者函数指针的形参

2. 引用类型模板形参

 不能自动转换成数组指针或者函数指针的形参,参数推导出错

5)可以根据函数指针推断模板实参

例如:

template <typename T> int compare (const T& ,const T&);
int (*pf1) (const int&,const int&) = compare<int>;


这里compare<int>模板被赋值给pf1函数指针。以后调用pf1执行函数的时候,编译器使用pf1的类型来推导模板实参。

6)模板实参推断顺序是从函数返回值开始,从左至右逐一推导

7)为防止推导失败,可以在调用函数时显式指定模板参数类型

 


 

 

 

你可能感兴趣的:(C++,c,编译器)