C++11/14? Compile time counter ?

rubricanis

Homo ludens
Ich sinne über folgendes nach, habe aber bislang noch keine Idee wie ich das angehen kann. Vielleicht könnt ihr mir da auf die Sprünge helfen.

Ich möchte erreichen dass jede Klasse eine eindeutige ID bekommt, also im Sinne von:
Code:
template<typename DERIVED> class Base {
public:
    static constexpr ID = ???
}; 

class A: public Base<A>{...};  // ID == 1 
class B: public Base<B>{...};  // ID == 2  etc

Peter
 
Vielleicht löst ja typeid() schon Dein Problem?
Nöö, das denke ich nicht, das ist ja ein Runtime-Feature. Ich denke da z.Z. eher in Richtung von ParameterPacks. Ich muss mich wohl noch intensiver mit Meta-Programmierung beschäftigen...
 
Das Problem das Du hast ist, template member werden erst beim ersten Zugriff instantiiert. D.h. wenn Du eine Lösung bastelst, werden die Nummern nach Reihenfolge deines Zugriffs verteilt, nicht nach Reihenfolge der Deklaration.

Selbst so, fällt mir gerade keine Variante ein, die nicht Laufzeitcode erzeugt.

Edit:
Mir ist gerade was mit SFINAE eingefallen. Ich muss das mal ausprobieren.
 
Selbst so, fällt mir gerade keine Variante ein, die nicht Laufzeitcode erzeugt.
Da staune ich aber! :) Ich denke das müßte möglich sein.
Mir ist gerade was mit SFINAE eingefallen.
Damit kann ich im Moment noch nichts anfangen. Aber ich werde mal suchen.

Nachtrag: Die Reihenfolge in der die IDs generiert werden ist egal, sie müssen nur eine auf die andere folgen, also 1,2,3 ... etc.
 
Nee ist eine Ente, das Problem ist, ich kann natürlich nicht prüfen ob ein Typ schon existiert ohne ihn zu erzeugen.

Wenn ein template sich selbst umdefinieren könnte …
 
Ich werde weiter überlegen und ich denke dass es da eine Lösung geben wird. Letztlich sind Templates ja nichts anderes als eine funktionale Sprache, leider mit einigen Limitierungen. Und in funktionalen Sprachen gibt es arithmetische Typen...

Klar kann das alles mit virtuellen Methoden realisiert werden aber das ist ja mit ziemlichem Laufzeit overhead verbunden den ich vermeiden möchte.
 
Das Problem ist, Du hast keinen Freestore in Templates. Du kannst also keine globalen Variablen oder Closures bauen.

Edit:
Übrigens sollte typeid zur Compile-Zeit passieren es sei denn Du wendest es auf Pointer oder Referenzen an.
 
Übrigens sollte typeid zur Compile-Zeit passieren es sei denn Du wendest es auf Pointer oder Referenzen an.
Hmmm, das ist interessant, wußte ich noch nicht! Ich lese gerade über boost any dass ja etwas ähnliches macht und typeid() verwendet. Wenn das zur CompileTime passiert wäre das evtl eine Lösung. Muss ich noch alles in Ruhe weiter evaluieren ....

Danke erst einmal soweit!

Peter
 
Der Sinn erschließt sich mir noch nicht so ganz... du könntest ja danach auf nicht durch die ID auf den Typ zugreifen, da du immernoch den template-Parameter brauchst um den Typ aufzulösen...
 
Der Sinn erschließt sich mir noch nicht so ganz...
So ganz ist mir das auch noch nicht klar ! :) Der Punkt ist dass es in funktionalen Sprachen arithmetische Typen gibt, also A | B | C auf die man dann in C++ typsicher casten kann. Ich meine mich zu erinnern dass das in D möglich ist. Boost macht mit any und variant ja das gleiche. Any ist mir ein wenig suspekt und vermutlich mit Laufzeit-Nachteilen verbunden. Natürlich kann man einen Variant-Typ machen indem man die ID per Hand mitgibt, aber das ist eben fehlernanfällig und hat vermutlich noch andere Nachteile.

Soweit ich das sehe funktioniert das mit rekursiven Templates aber ich weiß noch zu wenig darüber und muß mich noch weiter damit beschäftigen.

Aber offensichtlich treibt das auch andere um ...
s.u.a.
http://eli.thegreenplace.net/2014/variadic-templates-in-c/
http://www.codeproject.com/Articles/11250/High-Performance-Dynamic-Typing-in-C-using-a-Repla
 
Back
Top