如何在维持引用计数的同时将vtkSmartPointer<T>
转换为继承的类?
最小图示:
#include <iostream>
#include <vtkSmartPointer.h>
class A: public vtkObjectBase {
public :
A(){}
static A * New(){return new A();}
int var1 = 8;
};
class B: public A {
public :
B(){}
static B * New() {return new B();}
int var2 = 12;
};
int main (int argc, char ** argv) {
vtkSmartPointer<B> b = vtkSmartPointer<B>::New();
vtkSmartPointer<A> a = b; // this is fine
std::cout << "var1 = " << a->var1 << std::endl;
// this is not fine and I cannot find a vtk equivalent
// to boost's dynamic_pointer_cast for similar functionality
// vtkSmartPointer<B> c = a; // how do I do this?
}
我假设在某个地方必须有一个类似于boost dynamic_pointer_cast<T>
的宏,但是我找不到它。如果没有,并且有人可以提出一种实现此目标的方法,我将不胜感激。
答案 0 :(得分:1)
这里有两个问题。
"weight"
,而不是ExtractValue(xml, '//category[@field="weight"]/num')
。vtkObject
。vtkObjectBase
。因此您的代码将变为:
vtkTypeMacro()
有关更多信息,请查阅VTK User Guide中的“ 14.6编写VTK类”一章。
答案 1 :(得分:0)
好的,没关系,我找到了一个似乎可行的答案。如果有人偶然发现这里并希望避免遇到挫败感,我会将其发布。
事实证明,引用计数发生在vtkObjectBase中。因此,只要代码继承自此,vtk就会保持准确的计数。幸运的是,除非vtk允许,否则它不会让您使用vtkSmartPointer。
因此,似乎要实现一种增强样式的宏,只需执行以下操作即可:
template<typename T,typename V> vtkSmartPointer<T> vtkDynamicPointerCast(vtkSmartPointer<V> src) {
T* v = dynamic_cast<T*>(src.Get());
if (v) return vtkSmartPointer<T>(v);
else return vtkSmartPointer<T>();
}