Я нашел ссылку на предложение P0149R0 для C ++, которое, по -видимому, несколько описывает эту проблему. Мне интересно, если бы что-то позволило бы принято. PrettyPrint-Override ">
Код: Выделить всё
struct some_complicated_struct {
a_type_which_needs_to_know_where_another_member_is index_into_member;
the_member_in_question data;
};
Концептуально это возможно, потому что для того, чтобы достичь index_into_member, его смещение должно быть известно в отношении экземпляра astemplicate_struct . Именно здесь появляются указатели участников. C ++ дает возможность описывать эти смещения по имени и повторно использовать их даже в шаблонах. Однако, как утверждает P0149R0, несмотря на способность преобразовать из указателя в структуру в указатель на член, то обратное по какой -либо причине невозможно (хотя это было бы явно тривиально, потому что операция будет буквально обратной). Например: Там, где первоначально мы преобразовали бы указатель в структуру в указатель к элементу, добавив известное смещение, также должна быть возможна обратная операция, приняв указатель на элемент и вычитая известное смещение, чтобы получить исходную структуру. < /p>
Короче говоря: < /p>
Код: Выделить всё
member_type parent_type::* //eg: assuming we have a member pointer (the offset) of this form
//how do we nicely perform that inverse operation given a member_type* so that we have the address for
parent_type* //?
< /code>
Кстати, у меня уже есть доказательство концепции вышеупомянутого, которое является contexpr, используя смещенные махинации »(хотя я сомневаюсь, что это приемлемо всем компиляторам). Существуют предостережения, а именно тот тип, который должен знать, где должен прийти другой участник после*, и должен быть тип, который имеет более высокие или одинаковые требования к выравниванию, чем рассматриваемое смещение прямо раньше. Это связано с тем, что мы можем шаблон двух указателей участников, один для участника прямо заранее, и один к участнику, который нас на самом деле заинтересован. Используйте это
, чтобы определить, где должен быть член, который сам по себе сам по себе, что затем позволяет нам использовать его смещение (которое должно быть определена/известна уже компилятору) для достижения исходной структуры. Оттуда мы можем использовать второй указатель члена, как и для доступа к рассматриваемому участнику. Очевидно, есть некоторые проблемы с упорядочением определения, так что структура также должна была быть определена заранее. Довольно раздражает. Однако, поскольку я знаю, что это работает, я знаю, что также можно сделать аналогичный трюк, за исключением случаев достижения члена специально после смещения. Bit_cast и смещения макросов или встроенных. Ничего из этого не приятно. Так что мне интересно, если предположить, что у нас есть указатель на участника, есть ли способ получить адрес структуры без этого беспорядка? Если да, то какой синтаксис? > struct example {
int data;
int offset;
};
example ex;
example* exptr = &ex;
//get our member pointers...
auto ptr_to_mem = &example::data;
auto ptr_to_off = &example::offset;
std::cout
Подробнее здесь:
https://stackoverflow.com/questions/794 ... a-struct-f