Boost.Assign: использование объектов с map_list_of? - PullRequest
3 голосов
/ 23 сентября 2011

Использование C ++ с наддувом.В Boost.Assign можно ли использовать оператор new с map_list_of?

Например:

std::map<int, MyObject*> objects = boost::assign::map_list_of
       (1, new MyObject())(2, new MyObject())(3, new MyObject())

Если нет, есть ли другой способ сделать это?

Ответы [ 2 ]

5 голосов
/ 23 сентября 2011

Это работает, да;Вызов new просто возвращает указатель на MyObject, и его можно использовать везде, где этот тип допустим. HOWEVER вызов new может вызвать исключение, или конструктор MyObject может вызвать исключение, означающее, что вся ваша карта MyObjects, выделенная из кучи, будет утечка.

Если вам нужна безопасность исключений, а также нет необходимости удалять эти объекты, вы должны использовать вместо этого умный указатель:

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());
3 голосов
/ 23 сентября 2011

Кажется, да.Это прекрасно компилируется с VS2010 и повышением 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));
}
...