Chciałbym uzyskać przesunięcie standardowej zmiennej składowej układu, jeśli podano ją poinsem dla tej zmiennej. Nie mogę użyć offsetof
, ponieważ mam wskaźnik, a nie nazwę. Obecny kod Mam coś takiego wygląda i zastanawiam się, czy istnieje zgodny z normami sposób, aby pozbyć się zmiennej dummy
.Przesunięcie od wskaźnika członka bez tymczasowej instancji
template<class T>
struct {
ptrdiff_t get_offset(int (T::*mem))
{
T dummy;
return reinterpret_cast<char*>(&(dummy.*mem))
- reinterpret_cast<char*>(&dummy);
}
};
Funkcja ta powinna być tylko wymagalne z int
członkowskich zmiennych punktów (jest to celowe).
Jestem całkowicie pewien, że kompilator nie tworzy zmiennej dummy
, ale nadal byłoby miło, gdybym mógł się jej pozbyć. Nie mogę użyć wskaźnika pustego, ponieważ dereferencja null nie jest zdefiniowana (chociaż prawdopodobnie działa na wszystkich typowych kompilatorach). Rozwiązanie C++ 03 byłoby dobre, lub rozwiązanie C++ 11 jest również interesujące (ale nie jest już użyteczne dla mnie).
UWAGA: Mam już świadomość, że jest to zgodne tylko ze standardami, T to standardowy typ układu.
Typ powrotu powinien być 'ptrdiff_t', tak przypuszczam, i powinieneś użyć' std :: distance'. A funkcja powinna być "statyczna". –
@KerrekSB, tak. Kompiluję z pełnymi/dodatkowymi ostrzeżeniami w GCC, ale myślę, że 'size_t == ptrdiff_t', więc nie ma ostrzeżeń. –
'ptrdiff_t' jest podpisane ... w każdym razie' manekin' również powinien być statyczny, jak sądzę. –