我正在寻找std::static_pointer_cast的类似std::const_pointer_caststd::dynamic_pointer_caststd::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::SmartPointer只会增加然后减少拥有对象的引用计数器。

这意味着可以将“非原始”指针传递给接受智能指针的函数,也可以手动创建临时智能指针并将其传递给函数。

关于c++ - 为itk::SmartPointer进行指针转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27016173/

10-11 23:23