在C ++ STL

时间:2018-06-04 18:50:12

标签: c++ c++11 stl generic-programming function-object

以下是我在书中读到的一行代码

priority_queue<IteratorCurrentAndEnd, vector<IteratorCurrentAndEnd>, greater<>> min_heap;

其中IteratorCurrentAndEnd是实现operator>方法的类。为什么我们可以greater<>代替greater<IteratorCurrentAndEnd>?我检查并阅读了类似的内容,

template< class T = void >
struct greater;

但我真的不知道这意味着什么。它与void类型有关吗?实际上是什么?

感谢。

2 个答案:

答案 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