vtkDataArrayTemplate的非虚拟版本



我有一个模板类myClass<T>,其中T可以是标量(float、int、double等)我想创建一个vtkFloatArrayvtkIntArrayvtkDoubleArray,具体取决于类型T。

我认为vtkDataArrayTemplate<T>将是一个很好的解决方案。不幸的是,这是一个虚拟类,所以我不能写这个:

vtkSmartPointer< vtkDataArrayTemplate<T> > array =  vtkSmartPointer<vtkDataArrayTemplate<T> >::New();

因为当我尝试实例化myClass时,我会得到错误:

error: invalid conversion from ‘vtkObject*’ to ‘vtkDataArrayTemplate<float>*’ [-fpermissive]`

我认为这是因为vtkDataArrayTemplate::New()不存在(因为类是虚拟的),所以调用vtkObject::New()。然后我们理解了它不能将vtkObject转换为vtkDataArrayTemplate

所以我的问题是:

是否有vtkDataArrayTemplate的非虚拟版本允许我在T为float时创建vtkFloatArray,在T为double时创建vtkDoubleArray,等等?

p.S:我使用VTK 6.0.0

按照其他vtk问题的相同逻辑,您可以创建一个具有类型映射的工厂

std::map< vtktypes , std::function< void*() > > _map;

std::function< void*() >旨在成为一个简单的对象创建者,返回void*,然后需要将其静态地转换为目标类型。

类似:

_map[VTK_INT] = [](){ return new vtkFloatArray(); }

一封发给vtk用户邮件列表的电子邮件也帮助了我。vtkDataArray中的一个有用的静态函数已经指向我:

vtkDataArray::CreateDataArray(int dataType)

它允许创建dataType类型的数据数组。

现在,为了将模板参数T转换为vtk类型,我使用了我在另一篇文章中提到的代码:(谢谢norisknofun

#include <vtkType.h>
int GetVTKType(std::size_t hash_code)
{
    static std::map<std::size_t, long> typeMap;
    if(typeMap.empty())
    {
        typeMap[typeid(void).hash_code()]               = VTK_VOID;
        typeMap[typeid(char).hash_code()]               = VTK_CHAR;
        typeMap[typeid(signed char).hash_code()]        = VTK_SIGNED_CHAR;
        typeMap[typeid(unsigned char).hash_code()]      = VTK_UNSIGNED_CHAR;
        typeMap[typeid(short).hash_code()]              = VTK_SHORT;
        typeMap[typeid(unsigned short).hash_code()]     = VTK_UNSIGNED_SHORT;
        typeMap[typeid(int).hash_code()]                = VTK_INT;
        typeMap[typeid(unsigned int).hash_code()]       = VTK_UNSIGNED_INT;
        typeMap[typeid(long).hash_code()]               = VTK_LONG;
        typeMap[typeid(unsigned long).hash_code()]      = VTK_UNSIGNED_LONG;
        typeMap[typeid(float).hash_code()]              = VTK_FLOAT;
        typeMap[typeid(double).hash_code()]             = VTK_DOUBLE;
        typeMap[typeid(std::string).hash_code()]        = VTK_STRING;
        typeMap[typeid(long long).hash_code()]          = VTK_LONG_LONG;
        typeMap[typeid(unsigned long long).hash_code()] = VTK_UNSIGNED_LONG_LONG;
        typeMap[typeid(int64_t).hash_code()]            = VTK___INT64;
        typeMap[typeid(uint64_t).hash_code()]           = VTK_UNSIGNED___INT64;
    }
    return typeMap[hash_code];
}

所以最后的代码是:

vtkDataArray *array = 
    vtkDataArray::CreateDataArray(GetVTKType(typeid(T).hash_code()));

最新更新