Здравствуйте, Максим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, но имена переменных, должны быть определены каким-то образом — м.б. разными. Т.о. не надо описывать структуру каждый раз при изменении имен полей