C++ C+中的运行时类型转换+;,怎样?

C++ C+中的运行时类型转换+;,怎样?,c++,C++,我试图分析一个geotiff文件,非常简单,只是想得到所有的标签信息。我知道有libtiff和libgeotiff这样的lib。我想做的很简单:读出所有的标签 标记结构是: struct ifd_entry { _int16 tag_id; _int16 field_type; _int16 field_count; _int16 field_offset; }; 字段类型为int16,表示int8、int16、int32、float、double和其他格式。字段_count指示类型中的数据数

我试图分析一个geotiff文件,非常简单,只是想得到所有的标签信息。我知道有libtiff和libgeotiff这样的lib。我想做的很简单:读出所有的标签

标记结构是:

struct ifd_entry
{
_int16 tag_id;
_int16 field_type;
_int16 field_count;
_int16 field_offset;
};
字段类型为int16,表示int8、int16、int32、float、double和其他格式。字段_count指示类型中的数据数。Field_offset表示文件中从文件开头开始的字段数据位置

我要做的是检索标记及其指向的字段数据。我想写一个整洁的C++方式,但我不知道怎么做。似乎我无法避免使用switch语句分别处理每种类型:

class ifd
{
   ifd_entry hd;
   char *pfield;
public:   
   ifd(ifd_entry hd0,char *p); //allocate and copy the field data
   void print(); //print the ifd_entry and its field, have to use switch to cast to the correct type;
};

这可能是微不足道的,但我想知道C++将如何处理这些问题。谢谢。

如果类型的数量固定且较短,我会使用
Boost.Variant
。如果在可能的类型上有一个变量,那么访问者模式可以应用于例如打印字段。内部实现可能与您当前所做的没有太大区别,但我发现它更为惯用。

在这里使用switch语句似乎最合适。

std::ifstream instream(“settings.txt”);
std::ifstream instream("settings.txt");

template<> id<_int8> {enum{value=1};};
template<> id<_int16> {enum{value=2};};
template<> id<_int32> {enum{value=2};};

template<class TYPE>
std::vector<TYPE> read(const ifd_entry& entry) {
    assert(id<TYPE>::value == entry.tag_id);
    instream.seek(entry.field_offset);
    std::vector<TYPE> result.resize(entry.field_count);
    instream.read((char*)(TYPE*)(&result[0]), sizeof(entry.field_type)*entry.field_count);
    return result;
}

int main() { 
    ifd_entry entry;
    // read in entry
    // you know it points to _int32's because it's player's scores
    std::vector<_int32> result = read<_int32>(entry);
}
模板id{enum{value=1};}; 模板id{enum{value=2};}; 模板id{enum{value=2};}; 模板 标准::矢量读取(常量ifd_条目和条目){ 断言(id::value==entry.tag\u id); 流内寻道(输入字段和偏移); std::vector result.resize(entry.field\u count); 流内读取((字符*)(类型*)(&result[0]),大小(条目的字段类型)*条目的字段计数); 返回结果; } int main(){ 国际单项体育联合会参赛作品; //读入条目 //你知道它指向32,因为这是球员的分数 标准::矢量结果=读取(输入); }

这假设您只知道调用代码中的返回类型。这可能适用于您的情况,也可能不适用于您的情况。此外,上面的代码是否能按原样编译也值得怀疑。

谢谢您的回答。我不确定这对这个问题是否合适。该文件包含多个不同的标记,可能包括问题中提到的所有字段类型。换句话说,在我读出标签之前,字段类型是未知的。谢谢你提供的信息。goetiff最多支持11种字段数据类型。虽然我以前从未使用过boost,但这似乎是一个好方法。