По иронии судьбы, встала та же задача, только типы не стандартные, а свои - пользовательские. Использовал Loki. Смысл такой: чтение заголовка карты, в зависимости от типа заголовка. Вот такой код получился (понимаю, не самый удачный код, но не закидывайте, пожалуйста, камнями - я только учусь!
)
typedef Loki::Tuple<LOKI_TYPELIST_2(DCW_HEAD, HEAD)> TypeChart;
// ........................................................
TypeChart header;
QFile file(entity.name());
if(!file.open(QIODevice::ReadOnly)) return;
qint64 sz = -1;
switch(key)
{
case T_TOPO:
sz = file.read((char*)&Loki::Field<0>(header), sizeof(Loki::Field<0>(header)));
if(sz == -1 || sz != sizeof(Loki::Field<0>(header))) { file.close(); return; }
entity.setHeader(Loki::Field<0>(header).File_name, Loki::Field<0>(header).Latb, Loki::Field<0>(header).Late,
Loki::Field<0>(header).Lonb, Loki::Field<0>(header).Lone, Loki::Field<0>(header).C0);
break;
case T_MARINE:
sz = file.read((char*)&Loki::Field<1>(header), sizeof(Loki::Field<1>(header)));
if(sz == -1 || sz != sizeof(Loki::Field<1>(header))) { file.close(); return; }
entity.setHeader(Loki::Field<1>(header).File_name, Loki::Field<1>(header).Latb, Loki::Field<1>(header).Late,
Loki::Field<1>(header).Lonb, Loki::Field<1>(header).Lone, Loki::Field<1>(header).C0);
break;
}
file.close();
// ........................................................
Думаю, чем-то поможет. Функция Field<index>() - берет соответствующий тип. Насколько я понимаю, если функцию сделать шаблонной, то можно будет и упростить код. К сожалению, след. трюк не прошел:
// ........................................................
TypeChart header;
QFile file(entity.name());
if(!file.open(QIODevice::ReadOnly)) return;
qint64 sz = -1;
int index = -1;
switch(key)
{
case T_TOPO:
index = 0;
break;
case T_MARINE:
index = 0;
break;
}
sz = file.read((char*)&Loki::Field<index>(header), sizeof(Loki::Field<index>(header)));
if(sz == -1 || sz != sizeof(Loki::Field<index >(header))) { file.close(); return; }
entity.setHeader(Loki::Field<index>(header).File_name, Loki::Field<index>(header).Latb, Loki::Field<index>(header).Late,
Loki::Field<index>(header).Lonb, Loki::Field<index>(header).Lone, Loki::Field<index>(header).C0);
file.close();
// ........................................................
Для того, чтобы такая конструкция сработала index должен иметь тип T.