boost 的 factory

我们知道 STL container 的工作机制大致是:

  • allocator 先将内存分配好
  • 然后使用 placement construct 将对象在指定的内存调用对应的构造函数

这种机制下,STL 一般要求被管理的对象是 copy constructable 的,这样某些时候能够对其进行移动(如 std::vector 的 capacity 达到了)。但是这也引入了一个问题,某些时候我们建立一个临时的对象,仅仅是为了将容器里面某些对象给初始化出来,然后就没用了(做完之后就释放掉),那么一种可能避免这种开销的做法就是通过 factory,factory 可以看成是对 constructor 的封装,boost 提供了 in place factory 和 typed in place factory 两种 factory,前者并不以构造对象的类型为模板参数,而是在使用成员模板函数 apply 的时候加入这个类型;后者是将类型放在最外面。这样前者可以产生一个对象后生成多种类型的对象,而后者仅能产生特定类型的。

我们以前文例子中的 createPizza 为例,

// we have an interface pizza, and several impl: italian_pizza, chinese_pizza and etc
Container<pizza>
create_pizza (...) {
  boost::in_place_factory factory (gred, dow) ;
  Container<pizza> c ;
  // in some cases
  factory.apply <italian_pizza> (c.address) ;
  // ...
  return c ;
}

从某种意义上来说 boost 这个 factory 更像是特地为 non-copy constructable 且不是 default constructable 的对象设计的。

——————-
And all the men of his house, born in the house, and bought with money of the stranger, were circumcised with him.

Advertisements
boost 的 factory

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s