我需要能够在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
}
避免这种情况的最佳方法是什么?
答案 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!
}