模板特例化,偏特化,左右值引用

本文介绍了C++中模板特例化的概念与应用,包括模板类和模板函数的特例化方式,以及如何通过特例化处理特定类型的特殊情况。此外还讨论了非类型模板参数的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

temlplate<class T, typename U …>
其中尖括号<>中的T、U为模板参数,可以用class也可以用typename(书中推荐用ypename)

如类模板:
template<typename T>
class example{ T a; };
当T为某种特定的类型时需要改变类的定义,处理此特殊情况需要特例化模板:
template<>
class example<double> { int a; };

模板特例化大致意思为:如果class template拥有一个以上的template参数,我们可以针对其中某个(或数个,但非全部)template参数进行特例化工作,换句话说,我们可以在泛化设计中提供一个特例化版本(也就是将泛化版本中的某些template参数赋予明确的指定)。

又如:
template<typename T>
class C { ... };         这个泛化版本允许T为任何类型

template<typename T>
class C<T*> {  ... };    这个特化版本仅适用于“T为原生指针”的情况
                         “T为原生指针”便是“T为任何类型”的更进一步的条件限制

非类型模板参数

template<unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M])
{
    return strcmp(p1, p2);
}
compare("hi", "mon");
模板实例化:
int compare(const char (&p1)[3], const char (&p2)[4])

模板类特例化

模板函数特例化

template<class I, class T>
void func_impl(I iter, T)
{
    T a=9.5;
    cout << a << endl;
}
template<class I>
inline void func(I iter)
{
    func_impl(iter, *iter);
}
template<> //模板特例化
inline void func<int>(int iter)
{
    cout << iter << endl;
}

::半特例化

template<typename T>
void func(T a) {}
// 以下半特例化可单独写
template<typename T>
void func<T*>(T* a) {}

template<typename T>
void func(T* a) {}

左右值引用

这里涉及模板推导规则

template<typename T>
struct rm_ref
{
    typedef T type;
};
template<typename T>
struct rm_ref<T&&>
{
    typedef T type;
};
template<typename T>
struct rm_ref<T&>
{
    typedef T type;
};

template<typename _Tp>
    [[__nodiscard__]]
constexpr typename rm_ref<_Tp>::type&&
convert2rvalue(_Tp&& __t) noexcept
{
    return static_cast<typename rm_ref<_Tp>::type&&>(__t); 
}

rm_ref为去除引用获得去除引用后的类型
当rm_ref<?>中的?为 int时,T被推导为int;
当?为int&时匹配特例化struct rm_ref<T&>,T被推导为int;
当?为int&&时,匹配rm_ref<T&&>,T被推导为int;
template<typename T> void fun(T&& a)为万能引用,当参数为右值时自不必多说;当参数为int&时,似是fun(int& &a),a为引用类型,引向int&类型,T为int型。


总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值