Это, кажется, как дубликат этого вопроса:
Nested data member pointer - not possible?
суть принятого ответ говорит:
пуанты г-на-член может быть сформирован только выражением типа & qualified_id, который не ваш случай
C++ стандарт говорит, что в пункте 8.3.3:
Указатель членов:
В объявлении TD, где D имеет вид
nested-name-specifier * attribute-specifier-seqopt cv-qualifier-seqopt D1
, а спецификатор вложенных имен обозначает класс, а тип идентификатора в объявлении T D1 - это «имя-тип-тип-тип T-типа», тогда тип идентификатора D является «производным-декларатором» -type-list cv qualifier-seq указатель на член класса insested-name-specifier типа T ". Необязательный атрибут-спецификатор-seq (7.6.1) относится к указателю-к-члену.
Оказывается, есть способ сделать то, что вы хотите, что, похоже, работает над моим текущим компилятором (apple llvm 5.0). Тем не менее, очень зависит от реализации, и я определенно рекомендую не использовать это решение в любом виде кода производства:
//added a few data members to make it non-trivial
struct SubUnit {
double d;
int value;
};
struct Unit {
bool b;
char c;
SubUnit sub_unit;
};
intptr_t suOffset = offsetof(Unit, sub_unit);
intptr_t intOffset = offsetof(SubUnit, value);
intptr_t totalOffset = suOffset + intOffset;
// there is no way to convert this offset directly in a
// pointer-to-member AFAIK, so we have to trick a bit
int Unit::* pui = nullptr;
auto puiAddr = &pui;
intptr_t* puiAddrAsIntPtrPtr = reinterpret_cast<intptr_t*>(puiAddr);
*puiAddrAsIntPtrPtr = totalOffset;
//pui should now "point to the right offset"
//let's test it
Unit u;
u.sub_unit.value = 123456;
int val = u .* pui;
std::cout << "val: " << val << std::endl;
':: value' является' int' но вы присваиваете его к указателю на член? – 0x499602D2
Вам нужно создать объект Unit, чтобы иметь что-то, что можно было бы указывать на .... ok, nevermind. –
@JohnnyMopp Не обязательно. – 0x499602D2