标准库中有许多函数的结构如下:
std::foo(begin(x), end(x), bar);
令我困扰的是,99%的时间,争论都是开始和结束。为什么这些功能都没有过载,这些过载肯定会更常用,如:
std::foo(x, bar);
是语言或设计限制还是疏忽?感谢。
答案 0 :(得分:5)
看看Herb Sutter的旧专栏"Why no container-based algorithms?"
问题是如果你已经有了这样的话。
template<class Iter> std::sort(Iter, Iter) // (1)
template<class Iter, class Pred> std::sort(Iter, Iter, Pred) // (2)
然后介绍
template<class Container> std::sort(Container) // (3)
template<class Container, class Pred> std::sort(Container, Pred) // (4)
让C ++ 98容器很难区分(1)和(4):只需将iterator
和const_iterator
传递给sort()
,重载决策就可以匹配(4)而不是(1)。
使用C ++ 11和SFINAE,应该可以解决大多数这些问题,但完全重写可能要等到Concepts和Ranges完全解决了C ++标准委员会。