重载std函数如std :: distance是否合理?

时间:2017-10-31 07:29:30

标签: c++ iterator c++-standard-library

我有一个符合双向迭代器要求的自定义迭代器类(但不是随机访问)。但是,两个迭代器的距离也可以在恒定时间内找到。从概念上讲,it2 - it1是有效的,但it += n不是(这些运算符重载都没有实际实现)。

重载std::distance()以允许标准库算法使用此迭代器有效地计算距离是否合理?

我发现有关篡改std命名空间内容的适当性的相互矛盾的信息。

1 个答案:

答案 0 :(得分:3)

关于命名空间的使用,神圣的标准说:

[namespace.std]/1(强调我的):

  

如果添加声明或者C ++程序的行为是未定义的   命名空间std或命名空间std中的命名空间的定义   除非另有规定。 程序可能会添加模板   专门用于任何标准库模板到命名空间std   如果声明取决于用户定义的类型和   专业化符合标准库的要求   原始模板并未明确禁止

因此,不允许添加重载,因为它是一个新的声明。我找不到明确的禁止,因此认为在新的迭代器类型上完全专门化std::distance函数模板应该没问题。只要您满足原始模板的要求即可。主要要求是返回类型必须与std::iterator_traits<InputIt>::difference_type元函数指定的相同。它可能还需要您专门化std::iterator_traits