【问题标题】:Having typedef std::map<boost::shared_ptr<my_class>,my_description> how to return & shared_ptr from my function?拥有 typedef std::map<boost::shared_ptr<my_class>,my_description> 如何从我的函数返回 & shared_ptr?
【发布时间】:2011-07-15 00:32:32
【问题描述】:

所以我有这样的功能:

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重新分配map中的指针。 (我不需要删除该对象,因为在我清理地图 ptr 时它可以在其他线程中使用。)

【问题讨论】:

  • 这毫无意义。为什么要按值搜索按键操作?不应该正好相反吗?如果您需要同时查找两种类型的地图,请尝试使用 boost.bimap!那么只需说erase
  • 这就是重点 - 我想在一段时间内清理对 my_class 对象的引用,然后(使用描述)重新创建一个对象并将新对象的 ptr 放入地图中,放入原始 ptr 所在的位置.
  • ... 仍然没有得到它。为什么使用共享指针作为映射键?如果你把你的目标描述得更抽象一点,也许我们可以为此想出更好的设计?

标签: c++ boost shared-ptr


【解决方案1】:

好的,我不知道你真正想要做什么,但这是一个基本的想法:

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);

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 2011-09-13
    • 2011-09-27
    • 2013-06-12
    • 2013-04-16
    • 2014-08-10
    • 2012-09-01
    相关资源
    最近更新 更多