gpt4 book ai didi

c++ - 在智能指针的双图中查找原始指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:41 24 4
gpt4 key购买 nike

我需要能够搜索原始指针 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
}

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

最佳答案

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

要解决这个问题,您可以创建一个 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!
}

关于c++ - 在智能指针的双图中查找原始指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22694681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com