快速业务通道

Boost中应用的泛型编程技术

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
raits<T>看起来是这个样 子:

template <class Iterator>
struct iterator_traits {
  typedef ... iterator_category;
   typedef ... value_type;
  typedef ... difference_type;
   typedef ... pointer;
  typedef ... reference;
};

该traits的value_type可以让泛型代码得知该迭代器所“指向”的是 何种类型的数据;而iterator_category对迭代器的能力进行分类,针对不同类型 的迭代器我们选择与之适应的最高效的算法。

traits模板有一个很重要的 特点:它们是非侵入的(non-intrusive)。我们可以为任何类型提供相关信息, 不管它是内建的类型,还是第三方的库中提供的类型。为了给某一特定类型指定 traits,一般采用部分特化或者全特化traits模板的方式。

欲更深入的了 解std::iterator_traits,可以参阅SGI提供的资料。 std::numeric_limits<T>也采用了traits技术,提供表示各内建数值类型 取值范围的常量值。

4、标记分派

另外有一种技术经常与traits合用, 那就是标记分派。它依据类型的属性,通过函数重载进行分派。一个很好的例子 就是std::advance()函数。这个函数的功能是将一个迭代器递增n次,对于不同类 型的迭代器可以有各自优化的实现方法。如果是随机访问迭代器(可以以任意的 距离前后跳转),advance()函数可以用i+=n来实现,既简单又高效,只需要常量 时间。而其它的迭代器必须一步一步地递增,需要线性的时间复杂度。如果是双 向迭代器,n就可能为负值,因此必须判断对迭代器到底是增还是减。

标 记分派和traits类的联系很紧密。分派所依据的属性(在这个例子中是 iterator_category)一般都是通过traits类来取得。主advance()函数从 iterator_traits中获得对应于该iterator的iterator_category,然后调用重载 过的advance_dispach()函数。编译器依据作为参数传给advance_dispach()的 iterator_category,选择合适的重载版本。标记只是一个极其简单的类,它的唯 一任务就是为标记分派或者其它类似技术传递必要的信息。

namespace std {
 struct input_iterator_tag { };
 struct bidirectional_iterator_tag { };
 struct random_access_iterator_tag { };
 namespace detail {
   template <class InputIterator, class Distance>
  void advance_dispatch(InputIterator& i, Distance n, input_iterator_tag) {
   while (n--) ++i;
  }
  template <class BidirectionalIterator, class Distance>
  void advance_dispatch(BidirectionalIterator& i, Distance n,
    bidirectional_iterator_tag) {
   if (n >= 0)
     while (n--) ++i;
   else
    while (n++) --i;
   }
  template <class RandomAccessIterator, class Distance>
  void advance_dispatch(RandomAccessIterator& i, Distance n,
    random_access_iterator_tag) {
   i += n;
  }
 }
 template <class InputIterator, class Distance>
 void advance(InputIterator& i, Distance n) {
  typename iterator_traits<InputIterator>::iterator_category category;
  detail::advance_dispatch(i, n, category);
 }
}

5、适配器

适配器是一种类模板,建立在其它类型之上,提供新的 接口或者行为。标准库中就使用了适配器,比如std::reverse_iterator通过反转 迭代器的递增/递减行为,适配了迭代器,还有std::stack,通过适配标准容器, 提供一个简单的堆栈接口。

在这里可以找到标准库中所用适配器的深入阐 述。

6、类型生成器

类型生成器的工作是依据它的模板参数合成新

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号