【发布时间】:2026-01-04 20:55:02
【问题描述】:
出于好奇,将模板参数用于std::advance() 的距离类型,但使用迭代器的difference_type 用于std::next() 和std::prev() 中的距离的基本原理是什么?
为什么不使用相同的方法(任何一种)?
跟进:
默认n = 1 的存在似乎不会阻止next 被Distance 模板化,正如answer below 中所建议的那样。这样编译:
#include <iterator>
#include <set>
template<typename InputIt,
typename Distance = typename std::iterator_traits<InputIt>::difference_type>
InputIt my_next(InputIt it, Distance n = 1)
{
std::advance(it, n);
return it;
}
int main()
{
std::set<int> s;
my_next(s.begin());
my_next(s.begin(), 10ul);
return 0;
}
【问题讨论】:
-
不是重复的,但与*.com/questions/15017065/…密切相关
-
我会说“历史”,
std::next来自 C++11,并且具有更强的类型(更改std::advance肯定会破坏 ABI 和/或其他复古兼容性问题)。