Re[4]: доступ к элементам структуры
От: bookevg  
Дата: 31.05.07 05:36
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Здравствуйте, bookevg, Вы писали:


B>>Здравствуйте, Максим2006, Вы писали:


М>>>Здравствуйте, bookevg, Вы писали:


М>Это ведь непрямой путь к цели. Тут неизбежны накладные расходы. Прямой путь — это ввод методов по установке флагов. Кое-что можно перенести на рантайм, но это уже хаки по-любому.

М>
М>    struct StatusData
М>    {
М>    private:
М>        void SetStatus(unsigned status) { m_DataUnion.dataBit.nStatus = status; }
М>        unsigned GetStatus() { return m_DataUnion.dataBit.nStatus; }

М>        void SetReady(unsigned ready) { m_DataUnion.dataBit.nReady = ready; };
М>        unsigned GetReady() { return m_DataUnion.dataBit.nReady; };

М>        void SetReg(unsigned reg) { m_DataUnion.data = reg; };
М>        unsigned GetReg() { return m_DataUnion.data; };

М>    private:
М>        struct StatusField
М>        {
М>            void operator=(unsigned ready) { pThis()->SetStatus(ready); }
М>            operator unsigned() { return pThis()->GetStatus(); }

М>        private:
М>            StatusData* pThis() {
М>                StatusField StatusData::* pmem = &StatusData::Status;
М>                return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
М>            }
М>        };

М>        struct ReadyField
М>        {
М>            void operator=(unsigned ready) { pThis()->SetReady(ready); }
М>            operator unsigned() { return pThis()->GetReady(); }

М>        private:
М>            StatusData* pThis() {
М>                ReadyField StatusData::* pmem = &StatusData::Ready;
М>                return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
М>            }
М>        };

М>        struct RegField
М>        {
М>            void operator=(unsigned reg) { pThis()->SetReg(reg); }
М>            operator unsigned() { return pThis()->GetReg(); }

М>        private:
М>            StatusData* pThis() {
М>                RegField StatusData::* pmem = &StatusData::Reg;
М>                return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
М>            }
М>        };

М>    public:
М>        StatusField Status;
М>        ReadyField Ready;
М>        RegField Reg;

М>    private:
М>        struct Data {
М>            unsigned nStatus : 1;
М>            unsigned nReady : 1;
М>        };

М>        union DataUnion {
М>            Data dataBit;
М>            unsigned data;
М>        };

М>        DataUnion m_DataUnion;
М>    };
М>


Можно ли создать шаблон, который бы мог менять имена полей Status, Ready, Reg.
Т.е. описываем шаблон на базе данного примера, при этом имена struct Data безымянные (что-то типа bit0, bit1 и т.п.) и имена public-структур-полей безыменные: Bit0Field, Bit1Field, но имена переменных, должны быть определены каким-то образом — м.б. разными. Т.о. не надо описывать структуру каждый раз при изменении имен полей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.