首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较vtk数据类型和基本数据类型

比较vtk数据类型和基本数据类型
EN

Stack Overflow用户
提问于 2016-04-07 12:49:16
回答 2查看 1.7K关注 0票数 0

VTK为基本类型(float、int、double等)设置了类型,并为每种类型分配了一个整数。它们被指定为这里

函数GetDataType() (例如,在vtkDataArray中)返回一个与其中一个类型对应的整数。我想将该整数与基本数据类型(浮点数、int、double)进行比较。

有没有办法做到这一点,容易?

我使用的是一个模板类,参数T是标量。我想检查数据集的标量点数据是否与T具有相同的数据类型。

就目前而言,我所做的是类型大小比较:

代码语言:javascript
复制
vtkDataArray *scalars = image->GetPointData()->GetScalars();
if(scalars->GetDataTypeSize() != sizeof(T))
{
  std::cerr<<"Incompatible types"<<std::endl;
}

但是很明显,floatint都是4码大小的,所以它实际上不起作用。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-19 14:43:27

在收集了几个地方的信息之后,我得出结论,如果不自己创建两个类型列表之间的映射,就无法简单地编写这些信息。

所以,这是我发现的最优雅的方法:

我使用了norisknofun的映射的思想,但我倒过来了。我没有使用std::type_index(),因为看起来您可以从typeid()的结果直接获得hash_code。我把这个映射放在一个将基本类型转换为VTK类型的函数中,因为它可以用于其他目的,而不仅仅是比较(参见我的其他员额)。

代码语言:javascript
复制
#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];
}

因此,要比较vtk数据类型和基本类型(我的模板参数T),我需要:

代码语言:javascript
复制
vtkDataArray *scalars = image->GetPointData()->GetScalars();
if(scalars->GetDataType() != GetVTKType(typeid(T).hash_code()))
{
  std::cerr<<"Incompatible types"<<std::endl;
}

或者,如果我想像norisknofun那样拥有一个很好的比较函数,我可以这样做:

代码语言:javascript
复制
template < class T > 
bool is_same(long vtkType)
{
  return vtkType != GetVTKType(typeid(T).hash_code())
}

// somewhere.cpp
if(!is_same<T>(scalars->GetDataType()))
{
  std::cerr<<"Incompatible types"<<std::endl;
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-07 14:39:33

我想你得详细说明你自己的地图。您的编译器必须与激活的c++11兼容,但现在大多数现代编译器都支持此特性。

我不知道c++等同于“位”、“id_type”和“不透明”类型.

代码语言:javascript
复制
#include <iostream>
#include <typeinfo>
#include <typeindex>
#include <cstdint>
#include <string>
#include <map>

// copy from vtk header, use #include <vtkType.h> instead
#define VTK_VOID            0
#define VTK_BIT             1
#define VTK_CHAR            2
#define VTK_SIGNED_CHAR    15
#define VTK_UNSIGNED_CHAR   3
#define VTK_SHORT           4
#define VTK_UNSIGNED_SHORT  5
#define VTK_INT             6
#define VTK_UNSIGNED_INT    7
#define VTK_LONG            8
#define VTK_UNSIGNED_LONG   9
#define VTK_FLOAT          10
#define VTK_DOUBLE         11
#define VTK_ID_TYPE        12
#define VTK_STRING         13
#define VTK_OPAQUE         14
#define VTK_LONG_LONG          16
#define VTK_UNSIGNED_LONG_LONG 17
#define VTK___INT64            18
#define VTK_UNSIGNED___INT64   19

// vtktypes
    typedef long vtktypes ;

    // standard c++ types
    typedef std::size_t   mytypes ;
    typedef std::map< vtktypes, mytypes> map_t;

template < class T > 
bool is_same(vtktypes x)
{
    static std::map< vtktypes, mytypes> _map;
    if(_map.empty())
    {
        _map[VTK_VOID           ]   = std::type_index(typeid(void)).hash_code();
        //_map[VTK_BIT              ]   = std::type_index(typeid(void)).hash_code();
        _map[VTK_CHAR           ]   = std::type_index(typeid(char)).hash_code();
        _map[VTK_SIGNED_CHAR    ]   = std::type_index(typeid(signed char)).hash_code();
        _map[VTK_UNSIGNED_CHAR  ]   = std::type_index(typeid(unsigned char)).hash_code();
        _map[VTK_SHORT          ]   = std::type_index(typeid(short)).hash_code();
        _map[VTK_UNSIGNED_SHORT ]   = std::type_index(typeid(unsigned short)).hash_code();
        _map[VTK_INT            ]   = std::type_index(typeid(int)).hash_code();
        _map[VTK_UNSIGNED_INT   ]   = std::type_index(typeid(unsigned int)).hash_code();
        _map[VTK_LONG           ]   = std::type_index(typeid(long)).hash_code();
        _map[VTK_UNSIGNED_LONG  ]   = std::type_index(typeid(unsigned long)).hash_code();
        _map[VTK_FLOAT          ]   = std::type_index(typeid(float)).hash_code();

        _map[VTK_DOUBLE         ]   = std::type_index(typeid(double)).hash_code();
        //_map[VTK_ID_TYPE          ]   = type_index(typeid()).hash_code();
        _map[VTK_STRING         ]   = std::type_index(typeid(std::string)).hash_code();
        //_map[VTK_OPAQUE           ]   = type_index(typeid(void)).hash_code();
        _map[VTK_LONG_LONG         ]= std::type_index(typeid(long long)).hash_code();
        _map[VTK_UNSIGNED_LONG_LONG]= std::type_index(typeid(unsigned long long)).hash_code();
        _map[VTK___INT64           ]= std::type_index(typeid(int64_t)).hash_code();
        _map[VTK_UNSIGNED___INT64  ]= std::type_index(typeid(uint64_t)).hash_code();
    }

    map_t::iterator it = _map.find(x);
    return (it != _map.end()) && it->second == std::type_index(typeid(T)).hash_code();
}

int main()
{
    std::cout << "is same ? " << is_same<char>(2) << std::endl ;
    std::cout << "is same ? " << is_same<std::string>(13) << std::endl ;    

    return 0;
}

在您的情况下,您可以这样使用它:

代码语言:javascript
复制
vtkDataArray *scalars = image->GetPointData()->GetScalars();
if(!is_same<T>(scalars->GetDataTypeSize()))
{
  std::cerr<<"Incompatible types"<<std::endl;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36476714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档