2013-02-19 1 views
0

Что я хочу сделать - создать новый объект в новом потоке. Что-то вроде:Как использовать boost :: lambda для создания нового объекта для существующего указателя?

Class* object = 0; 
Arg arg; 
boost::thread t(lambda::bind(object = lambda::new_ptr<Class>()(boost::ref(arg)); 

он не компилируется, что правильный путь?

+2

Подсказка: Используйте [ Boost.Phoenix] (http://www.boost.org/libs/phoenix/), а не Boost.Lambda - последний устарел уже много лет. – ildjarn

+1

Если C++ 11 является для вас вариантом, просто выполните ' std :: thread t ([&] {object = new Class (arg);}); ' –

+0

Спасибо, ребята, но я не могу использовать C++ 11 прямо сейчас. Я собираюсь попробовать Phoenix ... –

ответ

0

Благодаря Илдъярн, я попытался с буст :: феникс и получил это работает, код:

Class* object = 0; 
CArg arg0; 
Arg arg1; 

boost::thread t(boost::phoenix::val(boost::ref(object)) = boost::phoenix::new_<Class>(boost::cref(arg0), boost::ref(arg1)); 

Опять же, из Илдъярн, тем лучше код:

Класс * объект = 0;

CArg arg0;

Arg arg1;

namespace phx = boost :: phoenix;

подталкивание :: поток т (PHX :: ссылок (объект) = PHX :: new_ < Класс> (PHX :: CREF (arg0), PHX :: исх (арг1));

+1

Это должно быть 'boost :: thread t (phx :: ref (object) = phx :: new_ < Class > (phx :: cref (arg0), phx :: ref (arg1));' (задано 'namespace phx = boost: : phoenix; '). Примечательно, что вы должны использовать' ref'/'cref' из пространства имен' boost :: phoenix', а не пространства имен ' boost'. – ildjarn

+0

Большое спасибо, это намного лучше, я обновлю код. –