将vtkSmartPointer投射到继承的类

时间:2018-09-18 02:26:52

标签: c++11 smart-pointers vtk

如何在维持引用计数的同时将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>的宏,但是我找不到它。如果没有,并且有人可以提出一种实现此目标的方法,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

这里有两个问题。

  1. 在大多数情况下,您想继承自"weight",而不是ExtractValue(xml, '//category[@field="weight"]/num')
  2. 您缺少vtkObject
  3. 您要寻找的是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>();
}