【发布时间】:2011-01-22 16:06:59
【问题描述】:
我只是想知道,既然无论如何你只能将随机访问迭代器传递给std::sort,为什么不首先为随机访问迭代器定义它来强制执行该限制?
#include <iterator>
#include <type_traits>
template <typename ForwardIterator>
typename std::enable_if<
std::is_same<
typename std::iterator_traits<ForwardIterator>::iterator_category,
std::random_access_iterator_tag>::value,
void>
::type sort(ForwardIterator begin, ForwardIterator end)
{
// ...
}
我发现单行错误消息比执行过程中由于类型错误导致的页面和页面的错误消息更容易阅读。
您可以对其他算法做同样的事情。标准 C++ 核心语言对于这项任务的表现力已经足够了,对吧?那么,没有这样做的任何特殊原因?
【问题讨论】:
-
我怀疑:在 C++03 中没有
enable_if,而且通常大多数 TMP 应用程序在标准中包含重要功能的最后期限(本应是 1997 年-是的。 -
@FredOverflow:很好,所以它不存在的事实强烈地向我表明,这个领域没有得到很好的发展。另一种可能性是支持将
sort与实际上是随机访问但低估其类别的迭代器一起使用。如今,您希望人们能够正确地获得迭代器类别,也许在 1997 年并没有那么多,所以当时标准不要求拒绝错误标记的迭代器可能是有用的sort. -
@Oswald:是的。
iterator_traits部分专门用于指针。 -
这肯定只是 QoI 问题吗?该标准指定了一个接口,而不是一个实现;它只需要实现提供与随机访问迭代器一起使用的
sort。无论实现是否为双向迭代器提供专门化作为扩展,如果您尝试使用带有sort的双向迭代器是否提供“改进的”编译错误,或者它是否只是让“自然" 错误消息落空。 -
@James:是的,24.3.1/1 说,“如果
Iterator是迭代器的类型,则需要定义类型(等等)”。我认为这应该被视为标准中其他任何地方使用的“迭代器”一词定义的一部分,所以当std::sort(实际上是算法部分,一般来说,25/4)说它的参数是迭代器时,这意味着用不是一个的东西来调用它是未定义的。
标签: c++ algorithm stl iterator typetraits