Я хотел бы получить смещение стандартной переменной элемента компоновки, если она снабжена указателем на эту переменную. Я не могу использовать offsetof
, так как у меня есть указатель, а не имя. Текущий код, который у меня есть, выглядит примерно так, и мне интересно, есть ли стандарт, совместимый с тем, чтобы избавиться от переменной dummy
.Смещение от указателя-члена без временного экземпляра
template<class T>
struct {
ptrdiff_t get_offset(int (T::*mem))
{
T dummy;
return reinterpret_cast<char*>(&(dummy.*mem))
- reinterpret_cast<char*>(&dummy);
}
};
Эта функция должна быть вызываемым с переменными точками int
только членов (это намеренно).
Я вполне уверен, что компилятор фактически не создает переменную dummy
, но все равно было бы неплохо, если бы я мог избавиться от нее. Я не могу использовать нулевой указатель, так как разворот null не определен (хотя он, вероятно, работает на всех распространенных компиляторах). Решение C++ 03 было бы хорошо, или решение C++ 11 также представляет интерес (но не может использоваться мной сейчас).
ПРИМЕЧАНИЕ: Я уже знаю, что это только стандарты, совместимые с T, является стандартным типом макета.
Тип возврата должен быть 'ptrdiff_t', я полагаю, и вы должны использовать' std :: distance'. И функция должна быть 'static'. –
@KerrekSB, да. Я компилирую с полными/дополнительными предупреждениями в GCC, но я думаю 'size_t == ptrdiff_t', поэтому никаких предупреждений. –
'ptrdiff_t' подписан ... в любом случае,' фиктивный' также должен быть статическим, я полагаю. –