格式:
声明部分:
template <typename T>
void Swap(T &a, T&b)
定义部分
template <typename T>
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
函数模板支持重载 也支持部分形参是具体类型
模板具体化: 碰到复杂类型的时候的解决办法
函数模板与普通函数的优先级
以上说的函数模板都是通过隐式实例化生成具体的函数定义
显示实例化:
template void Swap<int>(int , int);
这样就能特定让int类型使用该模板(应用于数据类型转换)
显式具体化:
template <> void Swap<int>(int &, int &)或 template <> void Swap(int &, int &)
这是使用专门的Swap模板来处理int类型的数据(开小灶)
显示实例化和显式具体化不要再同一个文件或同一个空间使用 会报错
编译器选择函数的顺序
编译器是如何选择的:
非const数据的指针和引用优于非const指针和引用参数匹配
这个只适用于指针或引用 如果是非指针或引用的数据的话会出现二义性:
blog ink = {25, "spots"};
void recycle(blot);
void recycle(const blot);
在完全匹配的情况下, 传入的参数转换成函数形参一样的数据类型的转换次数越少,就越优先使用。
多个参数时的匹配:
其他:
decltype关键字 用于在模板中限制新建变量的类型
具体可看书的295页(内容太多搞过来太麻烦了)
后置返回类型:
auto h(int x, float, y) -> double 这样就可以制定了模板的返回类型了
两个合在一起可以这样用:
template<class T1, class T2>// typename也行
auto gt(T1, x, T2 y) -> decltype(x + y)
{
return x + y;
}
这样就指定了传入的参数进行自动数据类型转换后和返回的类型是相符的了
第八章完结 明天开始第九章