Имея typedef std :: map <boost :: shared_ptr <my_class>, my_description> как вернуть & shared_ptr из моей функции? - PullRequest
0 голосов
/ 15 июля 2011

Итак, у меня есть такая функция:

boost::shared_ptr<my_class> get_class_by_name(std::string name)
{
    typedef std::map<boost::shared_ptr<my_class>, my_description> map_t;
    BOOST_FOREACH(map_t::value_type it, some_object.class_map)
    {
        my_description descr = it.second;
        if(descr.name == name)
        {
            return it.first;
        }
    }
    throw std::runtime_error("Class with such name was not found map not found!");
    boost::shared_ptr<my_class> null;
    return null;
}

Мне нужно, чтобы она возвратила такой boost :: shared_ptr, чтобы это была не копия ptr, а указатель, который находится внутри карты.Моя главная цель - сделать что-то подобное с результатом

boost::shared_ptr<my_class> result = get_class_by_name(name);
boost::shared_ptr<my_class> null;
result  =  null; //(or result.reset();)

, а затем переназначить указатель на карте с каким-либо другим ptr.(Мне не нужно удалять объект, потому что он может использоваться в каком-то другом потоке, когда я очищаю ptr карты.)

1 Ответ

1 голос
/ 15 июля 2011

ОК, я не знаю, что вы на самом деле пытаетесь сделать, но вот идея скелета:

typedef std::shared_ptr<my_class> my_class_ptr;
typedef std::map<my_class_ptr, my_description> my_map_t;

struct FindByName
{
  FindByName(cosnt std::string & s) : name(s) { };
  inline bool operator()(const my_description & d) { return name == d.name; }
private:
  std::string name;
};

/* Usage: */

my_map_t m = /* ... */
my_map_t::iterator it = std::find_if(m.begin(), m.end(), FindByName("bob"));

if (it != m.end()) m.erase(it);
...