Как использовать boost :: object_pool <> :: конструкцию с неконстантной ссылкой как параметр ctor? - PullRequest
0 голосов
/ 11 августа 2010

Возможно ли как-то использовать boost :: object_pool <> :: конструкцию с неконстантными ссылками?

Следующий фрагмент не компилируется (VS2010):

foo::foo(bar & b)
{
}

static boost::shared_ptr<foo> foo::create(bar & b)
{
  return boost::shared_ptr<foo>(foo_pool.construct(b),
    boost::bind(& boost::object_pool<foo>::destroy, & foo_pool, _1));
}

VS2010 жалуется на невозможность конвертировать bar & в const bar &. Глядя на boost :: object_pool <> :: construct, причина неясна:

element_type * construct(const T0 & a0)

Хотя я не могу сделать параметр ctor константным. Есть ли хитрость, чтобы заставить boost :: object_pool <> работать с моим классом foo?

1 Ответ

5 голосов
/ 11 августа 2010

Использование boost::ref:

static boost::shared_ptr<foo> foo::create(bar & b)
{
  return boost::shared_ptr<foo>(foo_pool.construct(boost::ref(b)),
    boost::bind(& boost::object_pool<foo>::destroy, & foo_pool, _1));
}

boost::ref составляет reference_wrapper.Поскольку в нем используется указатель, его можно скопировать по своему усмотрению и неявно разыменовать в ссылку на исходное значение.

...