2016-05-04 10 views
0

Ich versuche, eine Klasse zu erstellen, die eine Datei in C++ analysieren wird. Allerdings ist die Datei tatsächlich in 2 Dateien, der Kopfzeile und den Rohdaten.C++ unbekannter Variablentyp. Soll ich eine Vorlage verwenden?

Der Header enthält den Datentyp der Rohdaten (es kann int, double, float, etc ... sein). Ich möchte eine Variable in meiner Klasse erstellen, die die Rohdaten speichert. Die Verarbeitung wird unabhängig vom Datentyp gleich sein.

Sollte ich eine Vorlage dafür verwenden? Ist es nicht übertrieben, eine Template-Klasse für nur eine Variable zu verwenden?

Vielen Dank.

+0

'Sollte ich eine Vorlage verwenden, um dies zu tun? 'Was sind die anderen Optionen vor dir? – sjsam

+0

Ich weiß es nicht. Vielleicht deklariere einfach einen void pointer, ordne den notwendigen Speicher zu, kopiere Rohdaten und wirf dann die Pointer-Basis auf den Datentyp. Es ist nicht wirklich sauber, aber ich fühle mich wie eine Vorlage für nur eine Variable zu verwenden ist nicht optimal. Ist es ? – whiteShadow

+1

'boost :: variant' - keine Notwendigkeit, das Rad neu zu erfinden. –

Antwort

1

Vorlagen könnten Ihnen hier sicherlich helfen. Sie bieten eine Möglichkeit, die Wiederholung dieser Verarbeitung zu reduzieren, die für alle Typen gleich ist.

Ob Sie "sollten" sie verwenden ist natürlich eine schwierigere Frage, als ob es Overkill ist - beide sind Fragen der Meinungen, aber gemeinsame Verwendung würde vorschlagen, dass die Verwendung von nur einer Variablen wäre nicht der Faktor wäre Entscheide das.

Wenn der Inhalt der Dateien, die verschiedene Typen enthalten, in denselben Container verarbeitet werden müssen, oder wenn eine Datei mehr als einen Typ enthalten kann, wäre möglicherweise eine Boost-Variante besser geeignet.

Da Sie die Typen aus Datei lesen, sind diese Typen zur Laufzeit bekannt, aber da die Liste der Optionen zur Kompilierzeit bekannt ist, können Sie den Typ in der Datei überprüfen und den Typ übergeben.

if(typeFromFile == headerValueForint) 
{ 
    processFile<int>(); 
} 
else if (typeFromFile == headerValueFordouble) 
{ 
    processFile<double>(); 
} 

jedoch wie alle Typen, die Sie Liste numerisch sind (und ich frage mich, wie die Verarbeitung wirklich das gleiche sein könnte, wenn es keine anderen nicht-numerischen Typen ist) Sie alle Werte in als verdoppelt lesen konnte entscheiden - mit geeignete Reichweitenprüfung Es kann mehr Speicher benötigen, aber die Auswirkung hängt davon ab, was die Verarbeitung tatsächlich beinhaltet.

+0

Die Sache ist, ich habe eine Header-Datei, mir die Anzahl der Dimensionen, die Größe der einzelnen Dimensionen, die Art der Daten, etc ... Dann habe ich eine Binärdatei (Rohdaten), die ich basierend lesen muss diese Informationen. Um es einfacher zu machen, möchte ich den Header lesen und ein Array (mit dem richtigen Typ, Dimensionen, Größen usw.) erstellen, um alle Rohdaten darin zu speichern, also muss ich die Datei nur einmal lesen, und dann kann ich auf Daten im Array zugreifen. Zur Kompilierungszeit kenne ich die Größe oder den Typ des Arrays nicht wirklich, aber ich weiß es zur Laufzeit. – whiteShadow

+0

OK, in Bezug auf Typ, das ist, was mein Beispielcode zeigt. Eine Laufzeitprüfung, die den Vorlagencode mit dem richtigen Typ aufruft. Der tatsächliche Anruf wird wahrscheinlich anders als mein Beispiel sein, da es wahrscheinlich einige Parameter benötigt. In Bezug auf die Größe der Sammlung, das kann zur Laufzeit leicht genug eingestellt werden. – ROX

+0

Oh okay, ich habe falsch interpretiert, was Sie vorgeschlagen haben. Das war in der Tat mein ursprünglicher Plan, aber ich war mir nicht sicher, ob es eine gute Idee war, eine neue Template-Klasse für nur eine einzige Template-Variable zu erstellen. Vielen Dank :) – whiteShadow

2

Wie wäre es mit Funktion Überladung? Du hast gesagt, die Verarbeitung ist die gleiche, also ... ich denke du könntest. Ich benutze sie manchmal, um solche Sachen zu machen.

Beispiel:

header.h

class MyClass { 
public: 
    void function(int x); 
    void function(double x); 
    void function(string x); 
    void function(char x); 
}; 

Der Compiler wird wissen, was Funktion zu verwenden, abhängig von dem Wert, den Sie (passing), um es senden.

+0

Ist es nicht ein Problem, wenn Sie einige Unterfunktionen aufrufen müssen? Sie müssen wahrscheinlich auch sie überladen, oder? Sagen wir, ich muss auf meine Daten durch Koordinaten zugreifen (get (x, y, z)), dann muss ich für jeden Datentyp eine Funktion erstellen (da der Typ return anders sein kann). Ich fange an zu denken, dass eine Vorlagenklasse tatsächlich einfacher wäre. Vielen Dank. – whiteShadow

+0

Vorausgesetzt, dass die Verarbeitung die gleiche ist, wird die überladene Funktionsoption zu einer großen (fast) Wiederholung führen - jede unterscheidet sich nur darin, wo der Typ des Parameters x erscheint. Dies ist genau der Punkt, an dem Ihnen Vorlagen helfen, indem Sie den Codecode "ob Eingabeart" durch den Vorlagenparameter ersetzen und alle Versionen mit demselben Quellcode implementieren können. – ROX

+0

Das Problem ist, dass ich diese Daten speichern muss. Ich lese eine große Textdatei, und um die Effizienz zu verbessern, möchte ich diese Daten zuerst in einer Variablen speichern und dann etwas verarbeiten. Ich weiß noch nicht genau, wie die Verarbeitung sein wird. Um konkreter zu werden, erstelle ich ein Programm, das einige Dateien parst, die unterschiedliche Datendimensionen, Datentypen usw. haben können. Sagen wir zum Beispiel, dass ich Werte in einer bestimmten Region mitteln möchte, ich denke es ist einfacher ein Template-Array mit den Werten und eine Templates-Mittelungsfunktion zu haben, anstatt alles zu überladen. – whiteShadow

Verwandte Themen