Указатель на поле вложенной структуры
От: Аноним  
Дата: 28.02.13 08:38
Оценка:
Как правильно взять указатель на поле вложенной структуры, было бы хорошо чтобы она так же была отдельно.
#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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.