静态测试STL迭代器前向/双向/随机访问的类型?

时间:2017-09-20 19:15:12

标签: c++11

有没有办法静态测试迭代器的类型,并有一个依赖于它的模板执行不同但代码取决于类型(因为算法选择更改)?

1 个答案:

答案 0 :(得分:1)

您可以使用std::iterator_traits<T>::iterator_category获取迭代器的类别。例如:

#include <vector>
#include <type_traits>

int main()
{
    std::vector<int> v;

    static_assert(std::is_same_v<
        std::iterator_traits<decltype(v.begin())>::iterator_category,
        std::random_access_iterator_tag>);          
}

然后,您可以重载标记类型以提供静态分派:

void foo(std::random_access_iterator_tag); // (0)
void foo(std::bidirectional_iterator_tag); // (1)

int main()
{
    std::vector<int> v;
    std::list<int> v;
    foo(std::iterator_traits<decltype(v.begin())>::iterator_category{}); // calls 0
    foo(std::iterator_traits<decltype(l.begin())>::iterator_category{}); // calls 1
}
相关问题