我在cpp ref
中遇到了这段代码template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
在上述声明中使用typename Container::value_type
的目的究竟是什么?以下不起作用吗?
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<T>
> class priority_queue;
答案 0 :(得分:7)
这是更通用的:Container
是一个参数,它可能是一个容器(在T
上参数化),value_type
与T
不同。从我的头脑中我不知道一个很好的例子,但天真地也没有理由对使用过的Container
施加约束(即value_type
必须在你的版本中T
)
为了举例说明,假设您有一个strange_container
value_type
为std::pair<T,T>
,并希望使用
priority_queue<T,strange_container<T>>
然后您的默认Compare = std::less<T>
无法使用该容器,而Compare = std::less<typename Container::value_type>
会正确比较对。
请注意,上述内容不适用于C ++ 17,因为(来自cppref):
如果T与类型不同,则行为未定义 集装箱:: VALUE_TYPE。 (自C ++ 17起)
所以看起来签名被选择时考虑到了最大的通用性,只是后来才意识到这种自由度并不是最好的选择。实际上有充分的理由要求value_type
和T
相同,有关详情,请参阅here。