《c++ Templates》笔记 第二章 模板函数

模板参数的声明

template<comma-separated-list-of-parameters> // template<用逗号隔开的参数列表>

模板的定义和实例化

// 模板的定义
template<typename T>
inline T const& max(T const& a, T const& b)
{
    return a < b ? b : a;
}

// 实例化
int a = max(1, 2);            // 根据实参的类型使用int实例化
float b = max(4.0f, 3.0f);    // 根据实参的类型使用float实例化

// 实例化时,编译器会自动生成实例化的代码。比如使用int实例化会生成如下代码:
inline int const& max(int const& a, int const& b)
{
    return a < b ? b : a; // int支持a < b的调用
}

模板的编译:

  1. 实例化之前,先检查模板代码本身,查看语法是否正确;
  2. 实例化期间,检查模板代码,查看模板实参的所有调用是否都有效。上面的模板实参就必须支持 < 的调用

实参的推导

模板可以根据实参的类型来推导出实例化的类型,但所有的实参必须正确匹配类型,不支持自动转换类型。

template<typename T>
inline T const& max(T const& a, T const& b); // 两个实参的类型相同

// 使用时
max(4, 7); // OK:两个实参的类型都是int,使用int实例化
max(4, 7.0); // ERROR: 两个实参的类型不同,不知道使用哪个实例化

解决方法:

  1. 对实参使用强制类型转换

    max(static_cast<double>(4), 4.2);
    
  2. 显示指定实例化的类型

    max<double>(4, 4.2);
    

重载函数模板

inline int const& max(int const& a, int const& b)
{
    return a < b ? b : a;
}

template<typename T>
inline T const& max(T const& a, T const& b)
{
    return a < b ? b : a;
}

int main()
{
    max(2, 3);		   // 当模板和非模板函数都匹配时,优先匹配非模板函数
    max(2.0f, 3.0f);   // 模板函数有更优的匹配,调用模板函数
    max<>(2, 3);	   // 显示声明调用模板函数
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值