我在 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;
最佳答案
这更通用: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):
The behavior is undefined if T is not the same type as Container::value_type. (since C++17)
所以看起来在选择签名时考虑到了最大的通用性,直到后来才意识到这种自由度并不是最好的选择。实际上有充分的理由要求 value_type
和 T
相同,参见例如 here有关更多信息。
关于c++ - 在泛型编程中选择类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49454415/