vtkDataArrayTemplate 的非虚拟版本
Non-virtual version of vtkDataArrayTemplate
我有一个模板 class myClass<T>
,其中 T 可以是 标量(浮点数、整数、双精度等)
我想创建 vtkFloatArray
、vtkIntArray
或 vtkDoubleArray
,具体取决于类型 T.
我认为 vtkDataArrayTemplate<T>
会是一个很好的解决方案。
不幸的是,它是一个虚拟的class,所以我不能这样写:
vtkSmartPointer< vtkDataArrayTemplate<T> > array = vtkSmartPointer<vtkDataArrayTemplate<T> >::New();
因为当我尝试实例化 myClass 时,出现错误:
error: invalid conversion from ‘vtkObject*’ to ‘vtkDataArrayTemplate<float>*’ [-fpermissive]`
我认为是因为 vtkDataArrayTemplate::New()
不存在(因为 class 是虚拟的),所以 vtkObject::New()
被调用。那么我们就明白了,它不能把一个vtkObject
转换成一个vtkDataArrayTemplate
.
所以我的问题是:
是否有 vtkDataArrayTemplate
的非虚拟版本允许我在 T 为 float
时创建 vtkFloatArray
,当 T 为 [=25] 时创建 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-users 邮件列表的电子邮件在这方面也对我有所帮助。
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()));
我有一个模板 class myClass<T>
,其中 T 可以是 标量(浮点数、整数、双精度等)
我想创建 vtkFloatArray
、vtkIntArray
或 vtkDoubleArray
,具体取决于类型 T.
我认为 vtkDataArrayTemplate<T>
会是一个很好的解决方案。
不幸的是,它是一个虚拟的class,所以我不能这样写:
vtkSmartPointer< vtkDataArrayTemplate<T> > array = vtkSmartPointer<vtkDataArrayTemplate<T> >::New();
因为当我尝试实例化 myClass 时,出现错误:
error: invalid conversion from ‘vtkObject*’ to ‘vtkDataArrayTemplate<float>*’ [-fpermissive]`
我认为是因为 vtkDataArrayTemplate::New()
不存在(因为 class 是虚拟的),所以 vtkObject::New()
被调用。那么我们就明白了,它不能把一个vtkObject
转换成一个vtkDataArrayTemplate
.
所以我的问题是:
是否有 vtkDataArrayTemplate
的非虚拟版本允许我在 T 为 float
时创建 vtkFloatArray
,当 T 为 [=25] 时创建 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-users 邮件列表的电子邮件在这方面也对我有所帮助。 vtkDataArray 中一个有用的静态函数已指向我:
vtkDataArray::CreateDataArray(int dataType)
它允许创建 dataType 类型的数据数组。
现在,为了将模板参数 T
转换为 vtk 类型,我使用了我在此
#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()));