meta-template prog frage
-
Also ich habe folgendes Problem,
ich habe eine Classe welche Daten binär in eine Datei schreiben kann,dazu habe ich eine abstrakte bassisklasse erstellt
class BinDataItem { public : /** this ctor must be called by all base-classes */ BinDataItem(DataType dt) { m_id = dt; }; privat : BinDataItem(); }nun muss man sowas wie ein plugin schreiben, welches die Konvertierung vornimmt
z.B.class binString : public BinDataItem { public : binString() : BinDataItem(BinString) {} . . . }dann habe ich eine enum, in der alle unterstüzten Datentypen drinstehen
enum DataType
{
Double,
DoubleVec,
BinString,
NotSupported
};nun kann man neue Klassen erstellen, von BinDataItem ableiten, und kann diese
in die Binärdatei schreiben, das ist mir aber zu blöd,
da man in der enum eine ID für den Datentyp eintragen muss, und dann muss man noch den Base-ctor mit der ID aufrufen.gibt es eine Möglichkeit die enum automatisch zu füllen?
Was ich bräuchte wäre :
ein meta-programm was jeder Klasse eine unique-id vergibt,
aber ich weiss nichtmal wo ich da anfangen soll
-
Der Ansatz mittels enums und Klassenhierarchie ist meistens nicht so gut (wie du ja selber schon festgestellt hast, da man nämlich die enums nicht automatisch erzeugen kann).
Vielleicht solltest du für das Schreiben von binären Daten einen ähnlichen Ansatz wählen wie das Ausgeben von Streams, d.h.
class BinStream { // ... }; BinStream& operator<<(BinStream& bs, double); BinStream& operator<<(BinStream& bs, int); BinStream& operator<<(BinStream& bs, const char *); // ... BinStream << 1.23 << "Hello" << 42;Bei Interesse daran kann ich mal eine Klasse posten, die ich vor ein paar Jahren mal geschrieben habe (für das Schreiben/Lesen von Binärdaten in den Speicher).
-
der Ansatz ist nett, leider habe ich als Anforderung an die binär-datei,
das ein random-access auf einzelne elemente möglich ist
(ohne die ganze datei durchzuparsen)deshalb besteht meine datei zur Zeit aus
HeaderDatenFooterder Header hat eine konstante Grösse in Bytes, im Footer steht sowas wie ein
Inhaltsverzeichniss der Datei.
Nämlich : ID des Datentypes, und die Grösse des Datensatz,
und mit der ID kann ich dann bestimmen, welche "Dekodierungsklasse"
diesen Datentyp von raw-byte zurückkonvertieren kann.Ich werde wohl noch ein wenig nachdenken müssen.
Und bin für jede Anregungen dankbar.
-
Wenn du die ID wirklich extern brauchst (in der Datei), dann kommst du wohl um die enums nicht drumherum.
Wobei es bei größeren Projekten auch nervig sein kann, wenn man die enums erweitert und dann alle abhängigen Klassen neu kompiliert werden müssen.