Boost.Assign:使用具有映射列表的对象? 使用C++与Boost。在Boost.Assign中,我可以使用映射列表为的新运算符吗

Boost.Assign:使用具有映射列表的对象? 使用C++与Boost。在Boost.Assign中,我可以使用映射列表为的新运算符吗,c++,boost,stdmap,C++,Boost,Stdmap,例如: std::map<int, MyObject*> objects = boost::assign::map_list_of (1, new MyObject())(2, new MyObject())(3, new MyObject()) std::map objects=boost::assign::map\u列表 (1,新对象())(2,新对象())(3,新对象()) 如果没有,还有其他方法吗?似乎是的。使用VS2010和boost 1.47可以很好地编

例如:

std::map<int, MyObject*> objects = boost::assign::map_list_of
       (1, new MyObject())(2, new MyObject())(3, new MyObject())
std::map objects=boost::assign::map\u列表
(1,新对象())(2,新对象())(3,新对象())

如果没有,还有其他方法吗?

似乎是的。使用VS2010和boost 1.47可以很好地编译

#include <boost\assign.hpp>
class MyObject{
public:
    MyObject(int i):m_i(i){}
private:
    int m_i;
};


int main (void)
{
    std::map<int, MyObject*> objects = boost::assign::map_list_of(1, new MyObject(1))(2, new MyObject(2))(3, new MyObject(3));
}
#包括
类MyObject{
公众:
MyObject(inti):m_i(i){}
私人:
国际货币基金组织;
};
内部主(空)
{
std::map objects=boost::assign::map_list_of(1,新对象(1))(2,新对象(2))(3,新对象(3));
}

它确实有效,是的;调用new只返回一个指向MyObject的指针,可以在该类型有效的任何地方使用它但是对new的调用可能会引发异常,或者MyObject的构造函数可能会引发异常,这意味着堆分配的MyObject的整个映射将被泄漏

如果您希望异常安全,并且不必费心删除这些对象,则应使用智能指针:

std::map<int, boost::shared_ptr<MyObject> > objects = boost::assign::map_list_of<int, boost::shared_ptr<MyObject> >
    (1, new MyObject())
    (2, new MyObject())
    (3, new MyObject());
std::map objects=boost::assign::map\u列表
(1,新的MyObject())
(2,新的MyObject())
(3,新的MyObject());

此代码仍然不是异常安全的;在执行的map\u列表之前,
MyObject*
s不会变成
shared\u ptr
s。为了异常安全,每个
新的MyObject()
都需要替换为,例如
boost::make_shared()
@ildjarn如果map_list_是一个函数调用,那么您就完全正确了;它实际上是一个函子对象。映射列表(1,新的MyObject());是它的构造函数,并且是异常安全的;下面的每个操作符()调用也是异常安全的。@ildjarn仔细想想,您就在这里。的map_list_将其第二个模板参数推断为MyObject*,如果在异常完成之前抛出异常,则会泄漏。我已经编辑了的map_list_的模板参数,因此它是异常安全的。说真的,只需调用
make_shared