在智能指针的bimmap中找到一个原始指针

Find a raw pointer in a bimap of smart pointers

本文关键字:指针 一个 原始 智能 bimmap      更新时间:2023-10-16

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

bimap<shared_ptr<Thing>, int> bm;
void f(Thing* thing)
{
    bm.left.find(thing); // (Nasty) compile error
}

规避这个的最好方法是什么?

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

为了解决这个问题,您可以创建一个shared_ptr,其中包含一个不执行任何操作的删除器。这是一个函子,它什么也不做,而不是像智能指针所希望的那样删除对象。下面是Boost文档中的一个简单的删除器:
struct null_deleter
{
    void operator()(void const *) const
    {
    }
};
现在你的代码变成:
void f(Thing* thing)
{
    bm.left.find(shared_ptr<Thing>(thing, null_deleter)); // compiles
}

但是!我们使用的是c++ 11,它有一个方便的特性,叫做lambda,也就是匿名函数。您可以使用它从一次性函函数(如null_deleter)中整理代码。使用lambdas,上面的所有内容都可以替换为:

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