微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为非 std:: 命名空间内的距离启用 ADL,回退到 std::distance

我的用例如下 - 在一个非 std:: 命名空间中,一个类有一个模板化成员函数,它接受 2 个(模板化)迭代器作为参数,并且部分函数调用涉及调用 distance()那些迭代器。 问题是,一些容器对它们的迭代器的 distance() 有自己的重载。因此,如果我指定 std::distance,这还不够。 但是,由于该类不在 std:: 命名空间内,因此在没有自己的 distance() 重载的容器上调用没有 std:: 限定符的 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;
   }
}

通过这种构造,在 distance 的命名空间中找到的自定义 iterator_t 是首选,但回退到 std::distance

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。