如何解决为非 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 举报,一经查实,本站将立刻删除。