在通用编程中选择类型参数

时间:2018-03-23 16:32:52

标签: c++ stl typename

我在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;

1 个答案:

答案 0 :(得分:7)

这是更通用的:Container是一个参数,它可能是一个容器(在T上参数化),value_typeT不同。从我的头脑中我不知道一个很好的例子,但天真地也没有理由对使用过的Container施加约束(即value_type必须在你的版本中T

为了举例说明,假设您有一个strange_container value_typestd::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_typeT相同,有关详情,请参阅here