7

我正在尝试创建新对象并将它们添加到使用 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

4 回答 4

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)
  )
);
于 2010-11-05T02:29:05.937 回答
5

如果Stuff::some_memberisint并且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

于 2009-08-26T18:10:04.880 回答
3

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

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

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

并在我尝试使用 Object 构造函数的地方使用 Object_factory。

于 2009-08-26T19:13:15.563 回答
0

这取决于a::some_member返回的内容——如果它是 anObject那么你不需要将结果包装在一个Objectctor 中——它已经被构建了。如果例程没有返回,Object那么您可能需要稍微调整一下结果,您可以使用它来提取结果,boost::bind但实用程序函数可能会使代码更具可读性。

a无论哪种情况,更多代码都会有所帮助,特别是and的类型实例Object

于 2009-08-26T16:27:53.370 回答