将所有权从 unique_ptr<T,void(*)(T*)> 转移到 unique_ptr<const T,void(*)(const T*>
Transfer ownership from unique_ptr<T,void(*)(T*)> to unique_ptr<const T,void(*)(const T*)>
有了reinterpret_cast
,那将是这样的:
std::unique_ptr< const T , void (*) (const T *) >
to_const ( std::unique_ptr< T , void (*) (T *) > &ptr )
{
return { ptr.release() ,
reinterpret_cast< void (*) (const T *) >( ptr.get_deleter() ) } ;
}
这里强制转换的删除器函数将使用对象调用,这实际上是非常量。
但是,有没有更清洁的方法可以在避免UB的同时进行这种转移?
不使用void (*)(const T *)
作为删除器类型,不。但是我们可以制作自己的删除器:
template <class T>
struct ConstDeleter {
void (*deleter)(T*);
void operator()(T const* ptr) {
deleter(const_cast<T*>(ptr));
}
};
std::unique_ptr<T const, ConstDeleter<T>>
to_const(std::unique_ptr<T, void (*)(T*)>& ptr)
{
return {ptr.release(), ConstDeleter<T>{ptr.get_deleter()}};
}
这可以推广到任何删除程序类型。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- EASTL矢量<向量<int>>连续的
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- 对唯一 ptr 无效读取的引用向量
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 如何使用非类型参数传递模板化类的 Ref 或 Ptr