Guten Morgen,
ich programmiere aktuell ein Programm in C++ mit Qt in Visual Studio bei
dem ich eine .mat Datei (Matlab) einlesen möchte. Dafür nutze ich matio
und dies funktioniert soweit super. Damit das Lesen/Schreiben einer .mat
ein wenig übersichtlicher wird, baue ich aktuell einen kleinen Wrapper.
(Keine Sorge, Fehlerhandling und Co. kommt noch.)
Für das Lesen der einfachen Datentypen habe ich mir folgendes Template
gebastelt, welches auch super funktioniert:
Nun habe ich aber einen Datentyp der selbst ein Template besitzt. Wie
kann ich eine Art Spezialisierung mit Template erstellen? Da hört man
Template-Wissen bereits auf :( Als Beispiel mit std::vector<float>:
Funktioniert super, nur ich müsste eine Spezialisierung für alle
Datentypen erstellen, welche an std::vector übergeben werden können. Wie
muss das Template aussehen für folgende Spezialisierung?
1
// Funktioniert natürlich nicht, soll das Problem verdeutlichen
Ich lasse den Kram in den Funktionen und den QString weg, da es
irrelevant für dein Problem ist.
Du hast das Template:
1
template<typenameT>
2
Tget(){};
und kannst es vollständig speizalisieren für z.b. T=double:
1
template<>
2
doubleget(){};
3
autowert=get<double>();
oder T=std::vector<double>
1
template<>
2
std::vector<double>get(){};
3
autowert=get<std::vector<double>>();
was du nicht machen kannst, aber gerne machen würdest, ist das Template
teilweise spezialisieren für
1
template<typenameT>
2
std::vector<T>doubleget(){};
3
autowert=get<std::vector<double>>();
Es können nur Klassetemplates teilweise spezialisiert werden, aber keine
Funktionstamplates.
Deswegen musst du etwas anders vorgehen und aus deiner Funktion eine
Klasse machen.
Hallo ihr zwei,
danke für die gezeigten Möglichkeiten. Die Variante von Vincent geht
weit über mein Template-Wissen hinaus. Muss ich mal nachvollziehen, da
gibt es wieder was zum Lernen.
Die Variante von mh lässt sich bei mir wahrscheinlich am einfachsten
umsetzen. Ein Versuch ist es auf jeden Fall wert.
Danke!!!
mr. mo schrieb:> Die Variante von mh lässt sich bei mir wahrscheinlich am einfachsten> umsetzen. Ein Versuch ist es auf jeden Fall wert.
Du kannst die Klasse auch hinter einer Funktion verstecken, dann behälts
Du das bisherige Interface bei.
Gute Frage und gute Herangehensweise. Kleiner Tip noch:
mr. mo schrieb:> if (var->data_size == sizeof(T) && var != NULL)
Der rechte Teil der Abfrage ist so wie er da steht etwas sinnlos, denn
wenn er falsch ist wird er nie erreicht; ist der Pointer Null wird schon
das dereferenzieren im linken Teil mit einer Segmentation Violation
abbrechen. So wäre es richtig: