Использование boost :: bind с конструктором - PullRequest
7 голосов
/ 26 августа 2009

Я пытаюсь создать новые объекты и добавить их в список объектов, используя boost :: bind. Например.

struct Stuff {int some_member;};
struct Object{
    Object(int n);
};
....
list<Stuff> a;   
list<Object> objs;
....
transform(a.begin(),a.end(),back_inserter(objs), 
  boost::bind(Object,
     boost::bind(&Stuff::some_member,_1)
  )
);

Это не похоже на работу. Есть ли способ использовать конструктор с boost :: bind, или я должен попробовать другой метод?

Ответы [ 4 ]

11 голосов
/ 05 ноября 2010

Если вы используете boost 1.43, вы можете использовать boost :: factory и boost :: value_factory, что позволит вам инкапсулировать вызов конструктора. Как это:

 transform(a.begin(),a.end(),back_inserter(objs), 
  boost::bind(boost::value_factory<Object>(),
     boost::bind(&Stuff::some_member,_1)
  )
);
5 голосов
/ 26 августа 2009

Если Stuff::some_member равно int и Object имеет неявный ctor, принимающий int, это должно работать:

list<Stuff> a;   
list<Object> objs;
transform(a.begin(),a.end(),back_inserter(objs), 
  boost::bind(&Stuff::some_member,_1)
);

В противном случае вы можете использовать boost :: lambda :: constructor

3 голосов
/ 26 августа 2009

Ссылка Эрика говорит, в части «Невозможно взять адрес конструктора, поэтому конструкторы не могут быть использованы в качестве целевых функций в выражениях связывания». То, что я пытался сделать, было невозможно.

Я обошел это, создав функцию:

Object Object_factory(int n)
{  return Object(n); }

и используя Object_factory, где я пытался использовать конструктор Object.

0 голосов
/ 26 августа 2009

Это зависит от того, что a::some_member возвращает - если это Object, тогда вам не нужно переносить результат в Object ctor - он уже будет создан. Если подпрограмма не возвращает Object, то вам, вероятно, придется немного помассировать результат, который вы можете получить с помощью boost::bind, но функция утилиты может сделать код более читабельным.

В любом случае поможет больше кода, в частности, экземпляр типа a и Object.

...