[英]No op delete for unique_ptr
将 unique_ptr 传递给不执行任何操作的自定义删除器的最简洁方法是什么? 我需要一个我正在编写的 JNI 函数,其中 C++ 端需要一个 unique_ptr,但是,我不希望在退出 JNI 函数时删除 unique_ptr 持有的对象 - 我稍后会处理删除。 所以我想做类似的事情:
std::unique_ptr<MyClass, noop_delete> ptr;
在一行中 - 没有单独的函数定义:-)
正如@ 101010指出的那样, std::unique_ptr
带有nop删除器是非常奇怪的,因为std::unique_ptr
唯一有价值的东西实际上就是删除器。 另外,你说“C ++方面需要一个unique_ptr”,但是带有不同删除器的std::unique_ptr
将是一个不同的类型 ,这可能不起作用。
不过,这是做到这一点的方法:
struct nop
{
template <typename T>
void operator() (T const &) const noexcept { }
};
template <typename T>
using nop_unique_ptr = std::unique_ptr<T, nop>;
请注意,此nop类型可以在任何地方用作无操作,而不是单参数仿函数。
我在答案中对@ lisyarus的问题的回答促使我提出了一个比我给那里更好的解决方案。 这本书以已经@lisyarus陈述的事实:无操作删除器unique_ptr
是不同类型比的unique_ptr
具有delete
删除器。
我将此作为单独的答案发布,因为它可能与其他人相关(此外,这不适合单个评论)。
上下文 :对于单元测试,FakeIt模拟框架管理模拟对象的生命周期,因此当需要模拟通过unique_ptr指向的对象时,我们需要带有no-op删除器的unique_ptr。
// As in @lisyarus's answer...
struct nop
{
template <typename T>
void operator() (T const &) const noexcept { }
};
// NOTE: We have no use for a pointer that doesn't delete unless we're mocking, so
// the types below are named to indicate that.
#ifndef WE_ARE_BUILDING_UNIT_TESTS
// Production build - we want a unique_ptr that deletes.
template <typename T>
using mockable_unique_ptr = std::unique_ptr<T>;
#else
// Unit test build - we want unique_ptr that doesn't delete.
template <typename T>
using mockable_unique_ptr = std::unique_ptr<T, nop>;
#endif
现在,mockable_unique_ptr将根据构建类型自动切换类型,这意味着您不必在代码上遍布#ifdefs。 当然,你需要某些位置#ifdef /#else,并使用稍微不同的代码进行单元测试构建(可能在指针初始化的站点,但如果你的mock也在那里创建,你需要反正这样做)。 然而,其余代码保持不变,因为unique_ptr的接口不会改变。
std::unique_ptr::release
怎么样? 如
void JNIfunc (T*) {};
std::make_unique( new T) t;
JNIfunc( t.release);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.