itk::SmartPointer 的指针转换



我正在寻找类似 std::static_pointer_caststd::const_pointer_caststd::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;DRitk::SmartPointer不需要指针转换,只需转换"原始"指针并重新包装即可。


ITK 智能指针使用侵入式引用计数,这意味着拥有的对象必须提供引用计数器。

itk::SmartPointer只能与 ITK 类一起使用,或者更准确地说,只能与具有Register()UnRegister()方法的类一起使用。例如,itk::LightObject类的后代,根据文档,

是大多数 ITK 对象的最高级别的基类。它实现了引用计数...

因此,我的假设是

传递原始指针是不可能的,因为一旦自动创建的 const 智能指针超出范围,数据将被删除。

是不正确的,因为临时itk::SmartPointer只会增加然后减少拥有对象的引用计数器。

这意味着可以将"不那么原始"的指针传递给接受智能指针的函数,或者手动创建临时智能指针并将其传递给函数是安全的。

相关内容

  • 没有找到相关文章

最新更新