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

C++11 静态测试STL迭代器的类型前向/双向/随机访问?,c++11,C++11,有没有一种方法可以静态测试迭代器的类型,并让依赖于迭代器的模板根据类型执行不同的代码(因为算法选择会改变) 您可以使用来获取迭代器的类别。例如: #include <vector> #include <type_traits> int main() { std::vector<int> v; static_assert(std::is_same_v< std::iterator_traits<decltype(v

有没有一种方法可以静态测试迭代器的类型,并让依赖于迭代器的模板根据类型执行不同的代码(因为算法选择会改变)

您可以使用来获取迭代器的类别。例如:

#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>);          
}
#包括
#包括
int main()
{
std::向量v;
静态断言(std::is_same_v)<
标准::迭代器特征::迭代器类别,
std::随机访问迭代器(标签>);
}
然后可以重载标记类型以提供静态分派:

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
}
void foo(std::random_access_iterator_tag);//(0)
void foo(标准::双向迭代器标记);//(1)
int main()
{
std::向量v;
标准:清单五;
foo(std::iterator_traits::iterator_category{})//调用0
foo(std::iterator_traits::iterator_category{});//调用1
}

谢谢。这一半回答了问题。是否有一种根据结果执行不同代码的好方法?@C.Cheng:您可以简单地提供多个采用不同类别标记类型的重载。谷歌在这方面会有所帮助,因为这是一个相对常见的问题。