我正在尝试创建新对象并使用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的构造函数,还是应该尝试其他方法?
答案 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_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
答案 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>
在任何一种情况下,更多代码都会有所帮助,特别是a
和Object
的类型实例。