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:
1 | template <typename T>
|
2 | T get(QString name)
|
3 | {
|
4 | T val;
|
5 | matvar_t* var = Mat_VarRead(matfp, name.toStdString().c_str());
|
6 |
|
7 | if (var->data_size == sizeof(T) && var != NULL)
|
8 | memcpy(&val, var->data, var->data_size);
|
9 |
|
10 | Mat_VarFree(var);
|
11 |
|
12 | return val;
|
13 | }
|
Für das Lesen anderer Datentypen habe ich mir eine Spezialisierung
erstellt, wie z.B. für Complex:
1 | typedef std::complex<double> Complex; // In globals.h
|
2 |
|
3 | template <>
|
4 | Complex get<Complex>(QString name)
|
5 | {
|
6 | double re, im;
|
7 | mat_complex_split_t c = { &re, &im };
|
8 | matvar_t* var = Mat_VarRead(matfp, name.toStdString().c_str());
|
9 | Mat_VarReadDataLinear(matfp, var, &c, 0, 1, 1);
|
10 | Mat_VarFree(var);
|
11 |
|
12 | return Complex(re, im);
|
13 | }
|
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>:
1 | template <>
|
2 | vector<float> get<vector<float>>(QString name)
|
3 | {
|
4 | matvar_t* var = Mat_VarRead(matfp, name.toStdString().c_str());
|
5 |
|
6 | vector<float> val;
|
7 | val.resize(var->nbytes / var->data_size);
|
8 | memcpy(val.data(), var->data, var->nbytes);
|
9 | Mat_VarFree(var);
|
10 |
|
11 | return val;
|
12 | }
|
13 |
|
14 | vector<float> val = mat.get<vector<float>>("Variable");
|
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
|
2 | template <> template <typename T>
|
3 | vector<T> get<vector<T>>(QString name)
|
4 | {
|
5 | matvar_t* var = Mat_VarRead(matfp, name.toStdString().c_str());
|
6 |
|
7 | vector<T> val;
|
8 | val.resize(var->nbytes / var->data_size);
|
9 | memcpy(val.data(), var->data, var->nbytes);
|
10 | Mat_VarFree(var);
|
11 |
|
12 | return val;
|
13 | }
|