visual c ++中的boost :: object_pool :: construct()

时间:2011-12-11 11:46:28

标签: c++ visual-studio boost x86

在vc2008上使用boost 1.47(x86)

#include<boost/pool/object_pool.hpp>
class A
{
private:
    friend class boost::object_pool<A>;  //to prevent alloc other ways (ex> new A;)
    A(int a, int b){ aa = a; bb = b}
    int aa;
    int bb;
};

void main()
{
    boost::object_pool<A> pool;
    A* pa = pool.construct();   //error "No appropriate default constructor available"
}

默认构造函数不存在,如何使用 boost :: object_pool 创建类?

2 个答案:

答案 0 :(得分:0)

A* pa = pool.construct(1, 2);  // set required values here

根据Boost文档:object_pool

t.construct(???),返回ElementType *。 ElementType必须具有匹配???的构造函数。

AFAIK,这种魔法支持最多4个参数。

答案 1 :(得分:0)

要使用object_pool分配对象并将参数传递给其构造函数,请使用其construct方法而不是其malloc方法,如@ alex-f所示。就您而言:

A* pa = pool.construct(1, 2);  // The parameters are passed to A's constructor

问题在于,尽管boost::pool库仅是标头,因此本身不需要构建,但是construct方法需要声明和定义为接受任意多个参数。由于使用boost::pool的方法声明附带construct来接受最多100个参数会使标头过长并减慢了编译速度,因此他们选择的解决方案似乎是一次性脚本boost/pool/detail/pool_construct{_simple}.{sh,bat}需要运行以生成construct定义,这些定义支持许多参数。在boost::pool作为软件包可用的Linux发行版中,该脚本已为您运行。在Windows上或使用存储库中的库时,如果不运行脚本,则完全无法使用Construct方法。

pool_construct{_simple}脚本需要一个名为m4的预处理器引擎。我发现在Windows上运行pool_construct{_simple}脚本的最简单方法是从WSL运行bash并运行:

sudo apt install m4
./boost_dir/boost/pool/detail/pool_construct_simple.sh 10

如果您的构造函数使用make而不是10个参数,那么您当然可以更改参数。运行上面的命令将创建一个bool/pool/detail/pool_construct_simple.ipp,然后boost::pool的常规包含文件将获得对construct方法的支持。

运行非简单的pool_construct脚本会创建定义,以使每个参数都是常规的constvolatileconst volatile。因此,对于10个参数,有4 ^ 10个方法需要10个参数来编写。这将导致脚本长时间运行,使用大量内存并生成一个约700MB的pool_construct.ipp文件。我发现,在定义项目的方式中,巨大的文件甚至没有使construct方法可用于我的代码。