快速业务通道

Boost中应用的泛型编程技术

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
的类 型[注]。类型生成器产生的新类型一般作为生成器中嵌套的typedef出现。用类型 生成器的主要目的是为了让复杂的类型表达式显得更简单些。比如 boost::filter_iterator_generator:

template <class Predicate, class Iterator,
  class Value = complicated default,
  class Reference = complicated default,
  class Pointer = complicated default,
  class Category = complicated default,
  class Distance = complicated default
     >
struct filter_iterator_generator {
  typedef iterator_adaptor<
     Iterator,filter_iterator_policies<Predicate,Iterator>,
     Value,Reference,Pointer,Category,Distance> type;
};

看起来可真够复杂的。但现在生成一个合适的filter iterator可 就容易多了,只需要写:

boost::filter_iterator_generator<my_predicate,my_base_iter ator>::type

就行了。

7、对象生成器

对象生成器是一种函 数模板,依据其参数产生新的对象。可以把它想象成泛型化的构造函数。有些情 况下,欲生成的对象的精确类型很难甚至根本无法表示出来,这时对象生成器可 就管用了。对象生成器的优点还在于它的返回值可以直接作为函数参数,而不像 构造函数那样只有在定义变量时才会调用。Boost和标准库中用到的对象生成器大 多都加了个前缀make_,比如std::make_pair(const T&, const U&)。

看看下面的例子:

struct widget {
 void tweak (int);
};
std::vector<widget *> widget_ptrs;

通过把两个标准的对象生成器bind2nd和mem_fun合用,我们可以很轻松地tweak所 有的widget:

void tweak_all_widgets1(int arg)
{
  for_each(widget_ptrs.begin(), widget_ptrs.end(),
   bind2nd (std::mem_fun(&widget::tweak), arg));
}

如果不用对象 生成器,上面的函数可能就得这样来实现:

void tweak_all_widgets2(int arg)
{
  for_each(struct_ptrs.begin (), struct_ptrs.end(),
    std::binder2nd<std::mem_fun1_t<void, widget, int> >(
     std::mem_fun1_t<void, widget, int>(&widget::tweak), arg));
}

表达式越复杂,就越需要缩短这些冗长的类型说明,对 象生成器的好处也就越能显现。

8、策略类

策略类就是用来传递行为的模 板参数。标准库中的std::allocator就是策略类,把内存管理的行为应用到标准 容器中。

Andrei Alexandrescu在他的文章中对策略类进入了全面而深入 的分析,他写道:

“策略类精确地反映了设计时的抉择。他们要么 从其它类中继承,要么包含在其它类中。策略类在同样的句法结构上提供了不同 的策略。使用策略的类把它用到的每一个策略都作为模板参数,这样,用户就可 以自由地选择需要使用的策略。

策略类的强大在于它们能够自由地组合在 一起。通过把策略类作为模板参数的办法来组合多种策略,代码量与使用的策略 数只成线性关系。”

Andrei认为策略类的强大源于其小粒度和正交 性。Boost在迭代适配器库中的策略类运用可能淡化了这一卖点。在这个库中,所 有已适配的迭代器的行为都放在一个策略类里面。其实,Boost并不是开先河者。 std::char_traits就是一个策略类,它决定了std::basic_string的行为,尽管它 的名字叫traits而不叫policy。

注:因为C++缺少模板化的typedef,类型 生成器可以作为其替代方案。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号