在智能指针的bimmap中找到一个原始指针
Find a raw pointer in a bimap of smart pointers
我需要能够在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!
}
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 引用一个已擦除类型(void*)的指针
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将指针从一个void函数传递到另一个C++
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 不明白迭代器,引用和指针失效,一个例子
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 将指针分配给另一个指针时会发生什么情况?
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++将一个指针分配给另一个指针时执行的类型检查
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 取消引用结束指针到数组类型的一个
- 更改一个指针后更改乘法对象
- const和指针(一个节点示例)
- 从函数返回指针.一个指针的值未更新