条款47:请使用traits classes表现类型信息(2)
来源:互联网 发布:人工智能洗衣机 编辑:程序博客网 时间:2024/06/05 08:27
条款47:请使用traits classes表现类型信息(2)
Use traits classes for information about types.
大家好,上一篇我们讨论了如何设计和实现traits classes,本篇将继续前面讨论来讲述如何使用traits classes
来表现类型信息.好,我们现在有了iterator_traits,我们可以可以这样来实现advance函数:
template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d)
{
if( typeid( typename std::iterator_traits<IterT>::iterator_category ) ==
typeid ( std::random_access_iterator_tag ) )
...
}
这看起来还行是吧,其实它却有些潜在的问题.首先将导致编译问题,我将在下一款讨论这一点,我们现在应该关心更根
本的问题.IterT类型在编译期间获知,所以iterator_traits<IterT>::iterator_category也可在编译期间确定.但if语句
确是在运行期才会核定.为什么将可在编译期完成的事情延期到运行期才做呢?这不仅浪费时间,也造成可执行文件膨胀.我
们真正想要的是一个条件式来判断'编译器核定成功'的类型.恰巧C++的重载机制就满足这个需求,哇哈哈!
由于重载函数是根据传来的实参选择最佳的重载体,所以为了让advance的行为如我们所期望,我们需要产生几个接受不
同类型的iterator_category对象作参数的函数,我们将这函数取名为doAdvance:
//这份实现用于random access迭代器
template<typename IterT,typename DistT>
void doAdvance( IterT& iter, DistT d, std::random_access_iterator_tag)
{
iter += d;
}
//这份实现用于bidirectional迭代器
template<typename IterT,typename DistT>
void doAdvance( IterT& iter, DistT d, std::bidirectional_iterator_tag)
{
if( d >= 0 ){
while( d-- ){
++iter;
}
} else {
while( d++ ){
--iter;
}
}
}
//这份实现用于input迭代器
template<typename IterT,typename DistT>
void doAdvance( IterT& iter, DistT d, std::input_iterator_tag)
{
if( d < 0 ){
throw std::out_of_range( "Negative distance" );
}
while( d-- ){
++iter;
}
}
有了这些doAdvance重载版本,advance需要做的只是调用它们并额外传递一个对象,后者必须带有适当的迭代器分
类,于是编译器运用重载机制调用适当的实现代码:
template<typename IterT,typename DistT>
void advance( IterT& iter, DistT& d ){
doAdvance( iter, d, typename std::iterator_traits<IterT>::iterator_category() );
}
啦啦啦啦,搞定!现在我们来总结一下如何使用一个traits class了:
■ 建立一组重载函数或模板函数,彼此之间差异只在于各自的traits参数.令每个函数实现码与其接受之traits
信息相应和.
■ 建立一个控制函数或函数模板,它调用上述重载函数并传递traits class所提供的信息.
好了,今天任务完成!
请记住:
■ Traits classes使得'类型相关信息'在编译期可用.它们以templates和'templates特化'完成实现.
■ 整合重载技术后,traits classes有可能在编译期对类型执行if...else测试.
- 条款47:请使用traits classes表现类型信息(2)
- 条款47:请使用traits classes表现类型信息(1)
- 条款47:请使用traits classes表现类型信息
- 条款47:请使用traits classes 表现类型信息
- Effective C++ 条款 47:使用traits classes表现类型信息
- 条款48:请使用traints classes表现类型信息
- Effective C++ Item 47 请使用 traits classes 表现类型信息
- 《Effective C++》读书笔记之item47:请使用traits classes表现类型信息
- C++之使用traits classes表现类型信息(47)---《Effective C++》
- [翻译] Effective C++, 3rd Edition, Item 47: 为类型信息使用 traits classes(特征类)(上)
- [翻译] Effective C++, 3rd Edition, Item 47: 为类型信息使用 traits classes(特征类)(下)
- Item 47:使用Traits类提供类型信息
- traits class技术(条款47)
- c++中traits class表示类型信息
- 细说 C++ Traits Classes
- 条款47:需要类型转换时请为模板定义非成员函数
- C++ 类型信息获取 RTTI traits nest 大杂烩
- traits使用
- 在windows下安装collabnet subversion server 1.6.5
- 【非递归】判断一个整数是否能表示成2的指数形式(已附weapon0916兄的高效解法)
- Oracle数据导入导出imp/exp就相当于oracle数据还原与备份
- 热点
- c#快速导出到Excel
- 条款47:请使用traits classes表现类型信息(2)
- 纯真ip数据库格式详解:
- 内存相关函数(堆)
- JAR WAR
- “无人值守”怎么说
- 一招搞掂Quest SQL Navigator 5.5占用CPU高
- SSD5错题
- Java数据库操作大全
- LMail beta版,西西~ 简易的邮件客户端