【语法】模板(续)

  • 函数指针与实参推断

当使用函数模板初始化函数指针或为函数指针赋值时,编译器使用指针类型推断函数模板实参

template<typename T> inline bool compare(const T& lhs, const T& rhs)
{
    return lhs < rhs;
}

bool (*pfunc) (const int & lhs, const int & rhs) = compare; 
//pfunc = compare<int>;//显式指出

  • 模板实参推断 与 引用

左值引用(T&)

T& :只能传递给它左值:变量、返回引用的表达式

const T&: 可以绑定到任何类型:对象(左值)、临时对象(右值)、字面常量(右值)

右值引用(T&&)

一般传入右值,如func(3) 推断出T为int

通常不允许将右值引用绑定到左值上,但有两个特例
左值传递给模板函数的右值引用参数(T&&)
推断出实参为左值引用(T&)。因此:func(i),推断出T为int&而非int

引用折叠
T&& &和T& &&和T& & 折叠为T&
T&& && 折叠为T&&

任何参数类型可以传给右值引用。
若传入左值给它,则函数参数实例化为普通的左值引用(T->int & 、int& &&->int&)

通过引用可以保留const属性
通过右值引用可以保留左右属性


  • 函数模板特例化:
template<>
bool compare(const char* const &p1, const char* const &p2)
{
    return true;
}
  • 类模板特例化

函数模板不能部分特例化,类模板可以部分特例化

template<typename T> 
class Blob<T&>
{
private:
    vector<T> vec;
public:
    void func(const T& lhs);
    Blob operator++(int lhs);
    Blob(){};
    template<typename It> Blob(It b, It e);
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值