我正在寻找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::SmartPointer
只会增加然后减少拥有对象的引用计数器。
这意味着可以将“非原始”指针传递给接受智能指针的函数,也可以手动创建临时智能指针并将其传递给函数。
关于c++ - 为itk::SmartPointer进行指针转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27016173/