首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >省略C++ STL中较大模板的类型参数

省略C++ STL中较大模板的类型参数
EN

Stack Overflow用户
提问于 2018-06-05 02:50:12
回答 2查看 271关注 0票数 1

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

代码语言:javascript
复制
priority_queue<IteratorCurrentAndEnd, vector<IteratorCurrentAndEnd>, greater<>> min_heap;

其中,IteratorCurrentAndEnd是实现operator>方法的类。为什么我们可以用greater<>而不是greater<IteratorCurrentAndEnd>?我检查和阅读了类似这样的东西,

代码语言:javascript
复制
template< class T = void >
struct greater;

但我真的不知道这是什么意思。是不是和void类型有关?它到底是什么?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 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()函数模板的函数器,类似于

代码语言:javascript
复制
template< class T, class U>
constexpr auto operator()( T&& lhs, U&& rhs ) const
{
    return std::forward<T>(lhs) > std::forward<U>(rhs);
}

这实现了两种类型之间的一般比较(与现在提出的完全相同)。

票数 4
EN

Stack Overflow用户

发布于 2018-06-05 03:54:57

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

代码语言:javascript
复制
void foo(int x = 7);

foo(5); // x = 5
foo(); // x = 7
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50687002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档