Effective C++笔记
Use traits classes for information about types
STL迭代器分类
标准程序库提供的卷标结构
advance函数
Traits
编译期确定代码
#include <iostream>
#include <vector>
using namespace std;
template<typename IterT, typename DistT>
void doAdvance(IterT &iter, DistT d, random_access_iterator_tag)
{
iter += d;
}
template<typename IterT, typename DistT>
void doAdvance(IterT &iter, DistT d, bidirectional_iterator_tag)
{
if (d >= 0) { while (d--) ++iter; }
else { while (d++) --iter; }
}
template<typename IterT, typename DistT>
void doAdvance(IterT &iter, DistT d, input_iterator_tag)
{
if (d < 0)
throw out_of_range("Negative distance");
while (d--) ++iter;
}
template<typename IterT, typename DistT>
void myAdvance(IterT &iter, DistT d)
{
//不能通过编译
//if (typeid(typename std::iterator_traits<IterT>::iterator_category )
// == typeid(std::random_access_iterator_tag));
//iterator_category()
doAdvance(iter, d, std::iterator_traits<IterT>::iterator_category());
}
int main()
{
std::vector<int> vec = {1, 2, 3};
auto iter = vec.begin();
myAdvance(iter, 2);
cout << *iter << endl; //3
return 0;
}
总结