请使用traits classes表现类型信息。
traits classes使得类型相关信息在编译期可用。他们以template以及templates 特化完成实现。
整合重载技术后,traits classes有可能在编译期对类型执行If..else...测试.
以标准库中的迭代器为例:
首先根据迭代器的类型为迭代器提供卷标分类。
struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag:public input_iterator_tag{};
struct bidirectional_iterator_tag:public forward_iterator_tag {};
struct random_access_iterator:public bidirectional_tag{};
这种技术手法要求每一个用户自定义类型必须嵌套一个typedef名为iterator_category.用来确定适当的卷标结构。
例如
template<...>
class deque
{
public:
class iterator
{
public:
typedef random_access_iterator_tag iterator_category;
}
}
template<typename IterT>
struct iterator_traits
{
typedef typename Iter::iterator_category iterator_category;
}
//针对指针类型进行特化
template<typenameT>
struct iterator_traits<T*>
{
typedef random_access_iterator_tag iterator_category;
}
利用函数的重载完成if else测试
template <typename IterT ,typename DistT>
void doadvance(IterT& iter,DistT d,std::random_access_iterator_tag)
{
...
}
template <typename IterT ,typename DistT>
void doadvance(IterT& iter,DistT d,std::input_iterator_tag)
{
...
}