使用boost :: bind和构造函数

时间:2009-08-26 14:52:56

标签: c++ boost constructor bind

我正在尝试创建新对象并使用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 个答案:

答案 0 :(得分:11)

如果您使用的是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)
  )
);

答案 1 :(得分:5)

如果Stuff::some_memberint而且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

答案 2 :(得分:3)

Éric的链接部分说“不可能获取构造函数的地址,因此构造函数不能用作绑定表达式中的目标函数。”所以我试图做的事情是不可能的。

我通过创建一个函数来解决它:

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

并使用Object_factory我尝试使用Object构造函数。

答案 3 :(得分:0)

这取决于a::some_member返回的内容 - 如果它是Object,那么您不需要将结果包装在Object ctor中 - 它已经是建造。如果例程没有返回Object那么你可能需要按一下结果,你可以使用boost::bind,但实用程序函数可以使代码更具可读性。 / p>

在任何一种情况下,更多代码都会有所帮助,特别是aObject的类型实例。