template<class T,typename Compare =std::less<T>> 50

template<classT,typenameCompare=std::less<T>>classT后面的语句怎么理解?... template<class T,typename Compare =std::less<T>> class T后面的语句怎么理解? 展开
 我来答
q嘿仔
推荐于2018-04-05 · TA获得超过2879个赞
知道小有建树答主
回答量:107
采纳率:0%
帮助的人:182万
展开全部
可以这样拆分这理解:

定义一个可以传入两个类型参数的模板类(或函数)
template <class T, class Compare>

class 和 typename 在这里是一个意思,可以互换,所以可以写为
template <class T, typename Compare>

typename Compare = X
是模板里边默认参数的表示方法,跟函数的默认参数类似,表示如果不传入第二个参数,则默认使用X作为Compare的值

std::less是标准库中模板类(函数对象),需要传入一个参数T来使用,表示使用小于号作为比较准则;类似的还有greater<T>表示使用大于号作为比较准则

template <classT, typename Compare = std::less<T>>就是说,可以传入两个参数,一个T,一个Compare,但是第二个参数可以不传入,使用std::less<T>(传入第一个类型参数)作为其默认值,标准库中的set就是类似的定义方式(set其实有三个类型参数)

为了更好的理解,你可以用下面几种方式去使用定义的模板(这里用set作为例子)
1、使用默认参数
std::set<int> 等于std::set<int, std::less<int>>
std::set<Complex> 等于std::set<Complex, std::less<Complex>>
按照int/Complex小于号对容器中的元素进行排序(第一个元素最小)【Complex为用户自定义类型】
2、不适用默认参数(使用标准库里的模板类)
std::set<int, std::greater<int>>
std::set<Complex, std::greater<Complex>>
按照int/double大于号对容器中的元素进行排序(第一个元素最大)
3、使用用户自定义的【模板类】
std::set<int, MyCriterion<int>>
这里有要求的,MyCriterion模板类必须重载operator (),否则编译会失败【这里是对std::set而言,因为std:;set要求第二个参数必须重载operator ()】
MyCriterion定义如下:
template <class T>
class MyCriterion {
public:
bool operator() (const T& x, const T& y) const
{
return x < y;
}
};
PS:跟std::less<T>效果完全一样,通用
4、使用用户自定义的【类】
std::set<int, MyCriterion>
MyCriterion定义如下:
class MyCriterion {
public:
bool operator() (int x, int y) const
{
return x < y;
}
};
只能针对int类型的对象使用,不通用,此种使用只是为了更好的说明用法,通常不能这样用

如果还是不明白,继续追问!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式