在智能指针的bimap中找到原始指针

时间:2014-03-27 17:16:33

标签: c++ c++11 smart-pointers

我需要能够在Thing*中搜索原始指针boost::bimap<shared_ptr<Thing>, int>。但是,我无法使用签名bm.left.find(thingRawPtr)调用函数,因为无法从原始指针隐式构造智能指针:

bimap<shared_ptr<Thing>, int> bm;

void f(Thing* thing)
{
    bm.left.find(thing); // (Nasty) compile error
}

避免这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:6)

你必须创建一个智能指针,但不能以常规方式执行,因为那时你将有两个单独创建的智能指针管理一个对象,当一个指针决定删除Thing时,另一个指针留有一个悬空指针。

要解决此问题,您可以使用无操作删除器创建shared_ptr。这是一个无所事事的仿函数,而不是像智能指针那样删除对象。这是来自Boost's docs的简单删除器:

struct null_deleter
{
    void operator()(void const *) const
    {
    }
};

现在您的代码变为:

void f(Thing* thing)
{
    bm.left.find(shared_ptr<Thing>(thing, null_deleter)); // compiles
}

但是!我们使用的是C ++ 11,它有一个名为lambdas或匿名函数的便捷功能。您可以使用它来整理来自null_deleter等一次性仿函数的代码。使用lambda,上面的所有内容都可以替换为:

void f(Thing* thing)
{
    bm.left.find(shared_ptr<Thing>(thing, [](void*){}));
    // doesn't need null_deleter anywhere!
}