在非 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
.
我的用例如下 - 在非 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
.