我正在寻找类似 std::static_pointer_cast
、 std::const_pointer_cast
和 std::dynamic_pointer_cast
的东西来std::shared_pointer
。
我尝试了ITK的文档和itk::SmartPointer
的源代码,没有找到任何关于智能指针转换的信息。
在一个特殊的情况下,我需要在指针中添加"恒定性"(将itk::SmartPointer<T>
转换为itk::SmartPointer<const T>
),以便将其传递给第三方函数。传递原始指针是不可能的,因为一旦自动创建的 const 智能指针超出范围,数据将被删除。
我发现的唯一相对安全的解决方案:
static_cast<itk::SmartPointer<const T>>(itk_smart_pointer_of_t)
.
我不知道这种方法是线程安全的还是有其他可能的陷阱。而且,万一dynamic_cast
事情会变得更加混乱。
奇怪的是,ITK没有原生std::const_pointer_cast
式和其他演员阵容。
TL;DR:itk::SmartPointer
不需要指针转换,只需转换"原始"指针并重新包装即可。
ITK 智能指针使用侵入式引用计数,这意味着拥有的对象必须提供引用计数器。
itk::SmartPointer
只能与 ITK 类一起使用,或者更准确地说,只能与具有Register()
和UnRegister()
方法的类一起使用。例如,itk::LightObject
类的后代,根据文档,
是大多数 ITK 对象的最高级别的基类。它实现了引用计数...
因此,我的假设是
传递原始指针是不可能的,因为一旦自动创建的 const 智能指针超出范围,数据将被删除。
是不正确的,因为临时itk::SmartPointer
只会增加然后减少拥有对象的引用计数器。
这意味着可以将"不那么原始"的指针传递给接受智能指针的函数,或者手动创建临时智能指针并将其传递给函数是安全的。