Как правильно взять указатель на поле вложенной структуры, было бы хорошо чтобы она так же была отдельно.
#include <map>
#include <string>
#include <iostream>
using namespace std;
struct Test
{
struct SubStruct
{
int iField;
float fField;
};
int iField1;
float fField1;
int iField2;
float fField2;
SubStruct s1;
SubStruct s2;
SubStruct s3;
};
enum Type
{
TYPE_INT,
TYPE_FLOAT,
TYPE_INT_SUB
};
typedef int Test::*TIntField;
typedef float Test::*TFloatField;
typedef int Test::SubStruct::*TIntSubField;
struct FieldHolder
{
TIntField intField;
TFloatField floatField;
TIntSubField intSubField;
Type mType;
FieldHolder(TIntField field) : intField(field), floatField(nullptr), mType(TYPE_INT) {}
FieldHolder(TFloatField field) : intField(nullptr), floatField(field), mType(TYPE_FLOAT) {}
FieldHolder(TIntSubField field) : intSubField(field), mType(TYPE_INT_SUB) {}
void printResult(Test& t)
{
switch (mType)
{
case TYPE_INT:
cout << t.*intField;
break;
case TYPE_FLOAT:
cout << t.*floatField;
break;
case TYPE_INT_SUB:
break;
}
}
};
int main() {
Test t;
map<string, FieldHolder> mapHolder;
mapHolder.insert(make_pair("iField1", FieldHolder(&Test::iField1)));
mapHolder.insert(make_pair("fField1", FieldHolder(&Test::fField1)));
mapHolder.insert(make_pair("iField2", FieldHolder(&Test::iField2)));
mapHolder.insert(make_pair("fField2", FieldHolder(&Test::fField2)));
//mapHolder.insert(make_pair("iField3", FieldHolder(&Test::s1::iField)));
t.iField1 = 3;
t.fField1 = 3.14;
t.iField2 = -7;
t.fField2 = -7.4;
for (auto it : mapHolder)
{
cout << it.first << " ";
it.second.printResult(t);
cout << endl;
}
return 0;
}