下面是我在一本书中读到的一行代码
priority_queue<IteratorCurrentAndEnd, vector<IteratorCurrentAndEnd>, greater<>> min_heap;
其中,IteratorCurrentAndEnd
是实现operator>
方法的类。为什么我们可以用greater<>
而不是greater<IteratorCurrentAndEnd>
?我检查和阅读了类似这样的东西,
template< class T = void >
struct greater;
但我真的不知道这是什么意思。是不是和void
类型有关?它到底是什么?
谢谢。
发布于 2018-06-05 04:26:42
在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);
}
这实现了两种类型之间的一般比较(与现在提出的完全相同)。
发布于 2018-06-05 03:54:57
是的,它与代码片段中的void
相关,但作为类型本身,它并没有什么特别之处。此语法表示struct greater
接受一个模板参数(即一个类型),但可以省略该参数,如果省略了该参数,则使用void
作为该类型。它类似于常规函数的默认值语法:
void foo(int x = 7);
foo(5); // x = 5
foo(); // x = 7
https://stackoverflow.com/questions/50687002
复制相似问题