Ich möchte den Offset einer Standard-Layout-Elementvariable erhalten, wenn mit einem poiner zu dieser Variable bereitgestellt wird. Ich kann offsetof
nicht verwenden, da ich einen Zeiger und keinen Namen habe. Der aktuelle Code, den ich habe, sieht in etwa so aus, und ich frage mich, ob es eine standardkonforme Möglichkeit gibt, die dummy
Variable loszuwerden.Offset von Member-Zeiger ohne temporäre Instanz
template<class T>
struct {
ptrdiff_t get_offset(int (T::*mem))
{
T dummy;
return reinterpret_cast<char*>(&(dummy.*mem))
- reinterpret_cast<char*>(&dummy);
}
};
Diese Funktion sollte nur mit int
Membervariable (dies ist beabsichtigt) aufrufbar sein.
Ich bin ziemlich sicher, dass der Compiler nicht tatsächlich die dummy
Variable erstellt, aber es wäre immer noch schön, wenn ich es loswerden könnte. Ich kann keinen Nullzeiger verwenden, da das Dereferenzieren von Null nicht definiert ist (obwohl es wahrscheinlich bei allen gängigen Compilern funktioniert). Eine C++ 03-Lösung wäre gut, oder eine C++ 11-Lösung ist ebenfalls von Interesse (kann aber von mir nicht mehr verwendet werden).
HINWEIS: Ich bin mir bereits bewusst, dass dies nur Normenkonform ist, ist T ein Standard-Layout-Typ.
Der Rückgabetyp sollte "ptrdiff_t" sein, nehme ich an, und Sie sollten 'std :: distance' verwenden. Und die Funktion sollte "statisch" sein. –
@KerrekSB, ja. Ich kompiliere mit vollständigen/zusätzlichen Warnungen in GCC, aber ich denke 'size_t == ptrdiff_t', also keine Warnungen. –
'ptrdiff_t' ist signiert ... wie auch immer, der' Dummy' sollte auch statisch sein, nehme ich an. –