以下是我在书中读到的一行代码
priority_queue<IteratorCurrentAndEnd, vector<IteratorCurrentAndEnd>, greater<>> min_heap;
其中IteratorCurrentAndEnd
是实现operator>
方法的类。为什么我们可以greater<>
代替greater<IteratorCurrentAndEnd>
?我检查并阅读了类似的内容,
template< class T = void >
struct greater;
但我真的不知道这意味着什么。它与void
类型有关吗?实际上是什么?
感谢。
答案 0 :(得分:4)
在C ++ 14之前,std::greater<T>
是基于一个显式类型参数T
的类模板。它只允许比较两种相同的类型。否则,在比较不同类型时,必须依赖于在模板参数推导过程中失败的转换。
这已经用C ++ 14修复,因为现在也存在两种不同类型的一般比较。不使用新的类模板std::greater<T,U>
(可能不会向后兼容,当然也更复杂),而是使用在C ++ 14之前不存在的特化std::greater<void>
。选择类型void
正是出于这个原因:因为它从未在C ++ 14之前使用 - void
的比较没有意义 - 一个自动向后兼容,甚至避免引入新的班级模板。
正如reference中所描述的那样,std::greater<void>
现在是一个包含类似于
operator()
函数模板的仿函数
template< class T, class U>
constexpr auto operator()( T&& lhs, U&& rhs ) const
{
return std::forward<T>(lhs) > std::forward<U>(rhs);
}
这实现了两种类型之间的一般比较(并且与现在提出的类型完全相同)。
答案 1 :(得分:0)
是的,它与代码段中的import kerberos
kerberos.authGSSServerInit("user")
有关,但对于类型本身而言,void并没有什么特别之处。此语法表示void
采用一个模板参数(即类型),但可以省略,如果省略,struct greater
将用作该类型。它与常规函数的默认值语法类似:
void