定义:从函数实参确定模板实参的类型和值的过程叫做模板实参推断 《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)为防止推导失败,可以在调用函数时显式指定模板参数类型
分享到:
相关推荐
模板实参推断是编译器自动匹配模板参数的过程,它会尝试从函数调用的参数中推断出模板参数的类型。 2. **可行性检查**:候选的模板函数总是可行的,因为推断过程会排除那些不匹配的模板。接着,编译器会根据函数的...
- **函数模板实参推断**:7.5C++函数模板的实参推断.html详细阐述了编译器如何根据函数调用时的实际参数自动推断模板参数的过程,这是C++模板使用中极其重要的部分。 - **显式具体化**:7.6C++模板的显式具体化....
实参推断为了方便使用,除了直接为函数模板指定类型参数之外,我们还可以让编译器从传递给函数的实参推断类型参数,这一功能被称为模板实参推断。实参推断可以让编译器自动地推断类型参数,从而简化了函数模板的使用...
- **类型推断**:C++模板的类型推断机制是元编程的基础,通过模板实参推断出模板参数。 - **类型操作**:使用模板元编程可以创建新的类型、检查类型属性、构建类型列表等。 - **模板元函数**:通过模板模拟函数...
它基于模板实参推断和匹配规则来选择最佳匹配的模板。如果存在多个模板函数或类模板,且它们的参数列表不同,编译器将尝试推断出最合适的模板。 综上所述,C++ Templates是C++强大且灵活的工具,它们使得代码可以...
5. **函数模板**:函数模板用于生成具有通用类型的函数,模板参数表不能为空,A、B、C选项描述了模板的一些规则,而D选项是错误的,因为即使模板参数没有出现在函数形参表中,也可以通过模板实参推断。 6. **输入...
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...
4. **模板实参推断** - C++编译器能自动推断函数模板的类型参数,只要函数调用的参数类型能匹配模板函数的形参类型。 - 对于类模板,实例化对象时,如果类型没有明确指定,编译器也会尝试推断模板参数。 5. **...
关于模板实参的省略,通常编译器能够根据上下文推断出模板参数的类型,但在某些情况下,编译器可能无法确定,此时就需要显式提供模板实参。例如,当模板参数未在函数参数列表中出现,或者函数返回类型依赖于模板参数...
当我们调用一个函数模板时,编译器通常用函数实参来为我们推断模板实参。 2、非类型参数 非类型参数是一个模板参数,表示一个值而非一个类型。我们通过一个特定的类型名而非关键字class或typename来指定非类型参数...
在某些情况下,编译器可以从上下文中推断出模板参数的类型,此时可以省略模板实参。但是,如果模板参数不能从上下文中唯一确定,或者函数模板有常规形参,或者返回类型依赖于模板参数,或者模板参数未在函数参数...
在某些情况下,可能需要显式地指定模板实参来避免编译器的错误推断。例如: ```cpp int ia[5] = {10, 7, 14, 3, 25}; double da[6] = {10.2, 7.1, 14.5, 3.2, 25.6, 16.8}; string sa[5] = {"上海", "北京", "沈阳...
\n\n**模板实参推演**\n模板实参推演是编译器根据函数调用中的实参类型自动确定模板参数的过程。如果存在多个可能的推演结果导致二义性,那么就需要程序员显式指定模板参数。例如,下面的函数调用中,由于类型不匹配...
这里的`T`是一个类型占位符,编译器会根据传入的实参类型自动推断`T`的值。 2. **类模板** 类模板则用于创建泛型类。与函数模板类似,类模板定义了一个可以接受任意类型的数据结构。例如,`template , typename ...
在函数模板调用中,编译器可以根据实参自动推断模板参数的类型,这一过程称为模板参数推演。例如,当我们调用`min(3, 5)`时,编译器推断出`Type`为`int`。对于更复杂的情况,如指针或引用,编译器也能进行推演。 5...
4. **模板参数推断**:在调用模板函数或使用模板类时,编译器能够自动推断模板参数的类型,无需显式指定。这是通过比较实参类型和形参类型来实现的。 5. **模板特化**:在某些特定情况下,我们可能需要为模板提供...