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



  • offsetof().

    Edit: Sorry, geht nicht, das ist für den Compiler kein konstanter Ausdruck.


  • Mod

    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_offsetof weiter. 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.


Anmelden zum Antworten