2017-11-12 5 views
-2

Ich möchte Informationen aus einer Vorlagenklasse in eine Datei schreiben und dann in der Lage sein, aus einer Datei zu lesen, um eine Instanz dieser Vorlagenklasse zu erstellen. Ich weiß, wie ich es schreiben kann (verwenden Sie eine std::ofstream, schreiben Sie seine Template-Parameter und relevante Informationen), aber ich bin irgendwie verloren beim Lesen zurück. Ich konnte die Template-Parameter aus der Datei lesen, aber sie kann diese Instanz der Template-Klasse zur Laufzeit nicht kompilieren, so dass sie fehlschlagen würde (oder gar nicht kompilieren würde). Der Grund dafür ist, dass ich etwas im permanenten Speicher speichern kann. Die Klasse, für die ich das versuche, ist Eigens Tensor-Klasse, wenn das überhaupt hilft (das gegebene Beispiel ist allgemeiner und eine Lösung dafür würde immer noch funktionieren). Irgendwelche Ideen, wie ich das erreichen kann?Templates im persistenten Speicher speichern?

Ein Beispiel:

template<int example> class A{ 
    //omitted constructors and everything else 
    void write(std::ofstream& out){ //writes relevant information of class to a file 
     out<<example; 
    } 
}; 

Wie zum Lesen der Datei:

void read(std::ifstream& in){ 
    int example; 
    in>>example; 
    A<example> a; //doesn't work because A<example> can't be compiled at runtime 
} 

EDIT: Ich verstehe, wie Template-Klassen arbeiten, und dass sie nur dann kompiliert, wenn sie verwendet werden, . Ich verstehe auch, warum mein Beispiel nicht funktioniert. Meine Frage ist, ob es mir möglich ist, neue Instanzen zur Laufzeit zu kompilieren. Ich weiß, dass es möglich ist, dies mit .cpp-Dateien zu tun (nicht sicher, wie, ich weiß nur, dass es möglich ist). Ich weiß nicht, ob das mit Vorlagenklassen möglich ist. Meine derzeitige Lösung wird wahrscheinlich sein, dass mein Programm neue ausführbare Dateien erstellt und diese ausführt, damit sie die notwendigen Dinge bereits kompiliert haben, aber das ist langsam und unbefriedigend, also lasse ich diese Frage in der Hoffnung auf eine bessere Lösung.

+0

'Neue Instanzen zur Laufzeit kompilieren' - sicherlich nicht, es sei denn, Sie programmieren einen Compiler. Berücksichtigen Sie, dass sich der Compiler möglicherweise auf einem anderen Computer befindet, als Ihre ausführbare Datei ausgeführt wird. Wie kann die ausführbare Datei eine Kompilierung auslösen und ausführen, ohne dass ein vollständiger Compiler enthalten ist? – Aganju

+0

@Aganju Ich sorge mich wirklich nur darum, dass es auf meinem Rechner läuft, da ich nur dieses Programm schreibe, um etwas zu lernen, das völlig unabhängig von diesem Problem ist. Ich könnte leicht zu Python wechseln und Tensorflow oder Numpy verwenden, aber ich habe ein paar Gründe, warum ich nicht will. – BadProgrammer99

Antwort

-1

Template-Argumente müssen sowieso zur Kompilierzeit bekannt sein. Sie dürfen also keinen Variablenwert als Template-Argument übergeben.

+0

Ich erkenne, dass der Grund, warum ich die Frage gestellt habe, war, ob es einen Weg gibt. – BadProgrammer99

+0

Erfüllt die Verwendung von 'int' als Konstruktorparameter Ihre Anforderung? Genauso wie der Konstruktor von std :: vector. –

+0

Nein, ich habe die Klasse, für die ich das versuche, nicht geschrieben, und sie ist viel zu kompliziert und hat zu viele Abhängigkeiten, um sie zu ändern. – BadProgrammer99

-1

Template-Klassen sind, was der Name sagt - Vorlagen für den Aufbau der realen Sache, sobald ein Parameter gegeben ist. Es gibt kein Objekt einer Template-Klasse, und Sie können natürlich keine nicht existierende Sache in eine Datei schreiben oder lesen.
Ohne die Vorlage mit einem Parameter zu instanziieren, wird nichts kompiliert - die Template-Klasse ist nur die Anweisung für den Compiler, wie man es erstellt , falls erforderlich.

Verwandte Themen