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后面的语句怎么理解?
展开
1个回答
展开全部
可以这样拆分这理解:
定义一个可以传入两个类型参数的模板类(或函数)
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类型的对象使用,不通用,此种使用只是为了更好的说明用法,通常不能这样用
如果还是不明白,继续追问!
定义一个可以传入两个类型参数的模板类(或函数)
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类型的对象使用,不通用,此种使用只是为了更好的说明用法,通常不能这样用
如果还是不明白,继续追问!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询