在非 std:: 命名空间内为距离启用 ADL,回退到 std::distance

Enabling ADL for distance within a non-std:: namespace, with a fallback to std::distance

我的用例如下 - 在非 std:: 命名空间中,class 有一个模板化的成员函数,它接受 2 个(模板化的)迭代器作为参数,以及函数调用的一部分涉及在这些迭代器上调用 distance() 。 问题是,有些容器的迭代器有自己的 distance() 重载。所以如果我指定 std::distance,这是不够的。 然而,因为 class 不在 std:: 命名空间内,没有 std:: 限定符的 distance 调用将不会在没有自己的 distance() 重载的容器上解析为 std::distance。

我怎样才能重新解决问题(如果可能),以便 std::distance 在必要时被调用,而不是在相关迭代器存在重载时调用?

示例代码(非实际代码):

namespace derp
{
   template <class iterator_t>
   int a_function(iterator_t t1, iterator_t t2)
   {
      int a = distance(t1, t2); // want to resolve to std::distance if, for example, iterator is from std::vector
      // Do stuff with a and t1/t2
      return a;
   }
}

模板化为 std::vector 等是不可能的,因为有太多的 std:: 容器,它会导致代码膨胀。

这样做的惯用方式(通常用 swap 完成):

namespace derp
{
   template <class iterator_t>
   int a_function(iterator_t t1, iterator_t t2)
   {
      using std::distance;
      int a = distance(t1, t2); // want to resolve to std::distance if, for example, iterator is from std::vector
      // Do stuff with a and t1/t2
      return a;
   }
}

使用此构造,在 iterator_t 的命名空间中找到的自定义 distance 是首选,但回退到 std::distance.