1

这是我在一本书中读到的一行代码

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

IteratorCurrentAndEnd实现方法的类在哪里operator>。为什么我们可以有greater<>而不是greater<IteratorCurrentAndEnd>?我检查并阅读了这样的内容,

template< class T = void >
struct greater;

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

谢谢。

4

2 回答 2

4

在 C++14 之前,std::greater<T>它是基于一个显式类型参数的类模板T。它只允许比较两个相等的类型。否则,在比较不同类型时,必须依靠转换,这在模板参数推导过程中可能会失败。

这已在 C++14 中得到修复,因为现在还存在对两种不同类型的一般比较。代替使用新的类模板std::greater<T,U>(可能不会向后兼容并且当然也更复杂),std::greater<void>使用了在 C++14 之前不存在的特化。选择该类型void正是出于这个原因:因为它在 C++14 之前从未使用过——比较voids 没有意义——自动获得向后兼容性,甚至避免引入新的类模板。

正如参考文献中所述,std::greater<void>now 是一个函子,其中包含operator()类似于

template< class T, class U>
constexpr auto operator()( T&& lhs, U&& rhs ) const
{
    return std::forward<T>(lhs) > std::forward<U>(rhs);
}

这实现了两种类型之间的一般比较(并且与现在想出的完全一样)。

于 2018-06-04T20:26:42.000 回答
0

是的,它与void片段中的 相关,但 void 作为一种类型本身并没有什么特别之处。该语法表示struct greater接受一个模板参数(即一种类型),但可以省略它,如果省略,void则用作该类型。它类似于常规函数的默认值语法:

void foo(int x = 7);

foo(5); // x = 5
foo(); // x = 7
于 2018-06-04T19:54:56.927 回答