有没有办法静态测试迭代器的类型,并有一个依赖于它的模板执行不同但代码取决于类型(因为算法选择更改)?
答案 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
}