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

Geo*_*ard 5 c++ smart-pointers c++11

我需要能够搜索原始指针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
}
Run Code Online (Sandbox Code Playgroud)

绕过这个的最好方法是什么?

Geo*_*ard 6

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

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

struct null_deleter
{
    void operator()(void const *) const
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

现在您的代码变为:

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

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

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