你HaveRandomAccessIterator
模板过于复杂,有实现相同的结果的简单的方法。改变迭代器型的基础上的算法
一种标准方式是标签的调度:
//First, a helper type alias
template<typename Container>
using IteratorCategoryOf =
typename std::iterator_traits<typename Container::iterator>::iterator_category;
template<typename Container>
void algorithm(Container &c, std::forward_iterator_tag) {
//do generic version of algorithm
}
template<typename Container>
void algorithm(Container &c, std::random_access_iterator_tag) {
//do random-access version of algorithm
}
template<typename Container>
void algorithm(Container &c) {
algorithm(
c,
IteratorCategoryOf<Container>());
}
或者,您也可以通过std::enable_if
使用SFINAE。我怀疑这是你的目标是什么,但HaveRandomAccessIterator
可以写成的std::is_base_of
而言,这是简单得多:
template<typename Container>
using HaveRandomAccessIterator =
std::is_base_of<
std::random_access_iterator_tag,
IteratorCategoryOf<Container>>;
template<
typename Container,
typename std::enable_if<!HaveRandomAccessIterator<Container>::value>::type * = nullptr>
void algorithm(Container &c) {
//do generic version of algorithm
}
template<
typename Container,
typename std::enable_if<HaveRandomAccessIterator<Container>::value>::type * = nullptr>
void algorithm(Container &c) {
//do random-access version of algorithm
}
如果需要C++ 03的兼容性,您可以使用继承,而不是类型 - 别名,以及std::enable_if
和std::is_base_of
的增强对应。
非常感谢! :) – Melkon