constexpr workaround
-
hallo leute
verwende VC++2013 und brauch einen workaround fuer constexpr, falls es sowas irgendwie gibt.
folgendes moechte ich machen:constexpr int get_id(void *base, void *obj) { return 1000 + (reinterpret_cast<const char*>(obj) - reinterpret_cast<const char*>(base)); } class myclass { public: eine_klasse eins; eine_klasse zwei; eine_klasse drei; void mach_was(int id); }; void myclass::mach_was(int id) { switch(id) { case: get_id(this, &eins): mach_eins(); break; case: get_id(this, &zwei): mach_zwei(); break; case: get_id(this, &drei): mach_drei(); break; default: blub(); } }ich will also die objektposition in der klasse bestimmen und dann als id in switch-case verwenden.
jemand ne idee ?
Meep Meep
-
Edit: Sorry, geht nicht, das ist für den Compiler kein konstanter Ausdruck.
-
Nein, es ist unmoeglich. U.a. weil man in einer core constant expression keinen Zeiger haben kann der nicht auf ein Objekt dessen Typs zeigt. (
void*ist gewissermassen eine Ausnahme.) Der abstrakte Grund ist dass constant expressions moeglichst portabel sein sollen, die Werte die du aber extrahieren willst sind schon an sich voellig implementierungsspezifisch - nicht einmal fuer Standard-layout Klassen ist der Offset definiert*, lediglich dass Member in ihrer Deklarationsreihenfolge aufsteigende Adressen haben.Potenziell kommst du mit
__builtin_offsetofweiter. Dieses Intrinsic ist naemlich mit sowohl Clang als auch GCC so verwendbar:struct A{int a;}; int main() { constexpr auto i = __builtin_offsetof(A, a); }* Ausnahme ist natuerlich die erste (nicht-statische) Membervariable.