设为首页 加入收藏

TOP

3.10.4 使用更多的构造参数
2013-10-07 13:14:33 来源: 作者: 【 】 浏览:60
Tags:3.10.4 使用 更多 构造 参数

3.10.4  使用更多的构造参数

默认情况下,在使用object_pool的construct()的时候我们只能最多使用3个参数来创建对象。大多数情况下这都是足够的,但有的时候我们可能会定义3个以上参数的构造函数,此时construct()的默认重载形式就不能用了。

但construct()被设计为是可以扩展的,它基于宏预处理m4(通常Unix和Linux系统自带,也有Windows的版本)实现了一个扩展机制,可以自动生成接受任意数量参数的construct()函数。

pool库在目录/boost/pool/detail下提供了一个名为pool_construct.m4和pool_construct_simple.m4的脚本,并同时提供可在Unix/Linux和Windows下运行的同名sh和bat可执行脚本文件。只需要简单地向批处理脚本传递一个整数的参数N,m4就会自动生成能够创建具有N个参数的construct()函数源代码。

例如,在Linux下,执行命令:

  1. ./pool_construct_simple.sh 5;./pool_construct.sh 5 

将生成两个同名的.inc文件,里面包含了新的construct()函数定义,能够支持最多传递5个参数创建对象。由于m4生成的是C++(www.cppentry.com)源代码,因此.inc文件也可以拷贝到其他操作系统的Boost库中使用。

扩展construct()函数时请慎重,数量过多的参数定义会导致程序的编译时间增加,所以最好只定义最合适最需要的参数数量,而不是一味地求多。

如果只是临时的需要增加construct()函数的参数数量,或者工作的系统上m4不可用,我们也可以简单地定义一个辅助模板函数。

下面的代码模仿construct()函数实现了一个可接受4个参数的创建函数:

  1. template<typename P, typename T0, typename T1, typename T2, typename T3>  
  2. inline typename P::element_type*  
  3. construct(P& p, const T0& a0, const T1& a1, const T2& a2, const T3& a3)  
  4. {  
  5.     typename P::element_type* mem = p.malloc();  
  6.     assert(mem != 0);  
  7.     new (mem) P::element_type(a0, a1, a2, a3);  
  8.     return mem;  

自由函数construct()接受5个参数,第一个是object_pool对象,其后是创建对象所需的4个参数,要创建的对象类型可以使用object_pool的内部类型定义element_type来获得。函数中首先调用malloc()分配一块内存,然后调用不太常见的"定位new表达式"(placement new expression)创建对象。

假设我们有如下的一个4参数构造函数的类和一个object_pool对象:

  1. struct demo_class  
  2. {  
  3.     demo_class(int, int, int, int)                  //构造函数接受4个参数  
  4.     {   cout << "demo_class ctor" << endl;}  
  5.     ~demo_class()  
  6.     {   cout << "demo_class dtor" << endl;}  
  7. };  
  8. object_pool<demo_class> pl; 

那么使用m4和自定义的construct()创建对象的代码就是:

  1. demo_class* d1 = pl.construct(1,2,3,4);         //使用m4扩展  
  2. demo_class* d2 = construct(pl, 1,2,3,4);            //使用自定义扩展 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.9.2 操作函数 下一篇3.10.2 操作函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: