2017-11-09 12 views
-1

Also, ich mache eine Serialisierungsbibliothek, wo ich verschiedene Datentypen in einem stringstream speichern möchte, und dann base64 eine Zeichenfolge dieses stringstream codieren, um es dann in einer Datei zu speichern. Es funktioniert alles gut und gut, außer dass ich Dutzende von ähnlichen Funktionen machen muss. Der perfekte Ort, um Vorlagen zu verwenden, richtig?Kann eine bestimmte Funktion eine allgemeine Template-Funktion überschreiben?

Nun, ich bin nicht sicher, wie über das Tun so zu gehen, wie während ein gutes Geschäft der Funktionen sehr ähnlich sind

int save(stringstream&, const int); 
int save(stringstream&, const unsigned int); 
int save(stringstream&, const unsigned char); 

int SaveLoad::Save(stringstream & saveStream, const unsigned int input) 
{ 
    saveStream << input << Delimiter; 
    return 1; 
} 

einige von ihnen, wie

int save(stringstream&, const vector<int>); 

erfordern spezielle Handhabung wie folgt:

, so dass sie die Daten ordnungsgemäß aus dem Stringstream speichern und laden. Egal sogar Klassen, die noch mehr benutzerdefinierte Speicher-/Ladeverfahren haben.

Gibt es einen Weg zu tun, was ich will? Oder gibt es eine Möglichkeit, eine Template-Funktion nur für Typen einer bestimmten Art zu verwenden?

+0

_ "Oder gibt es eine Möglichkeit, eine Vorlagenfunktion nur für Typen einer bestimmten Art zu verwenden?" _ Sie können Vorlagenfunktionen und -klassen immer spezialisieren. Sie können auch nach bestimmten Typeigenschaften der Template-Parameter suchen, siehe 'std :: enable_if'. – user0042

+2

Suchen Sie nach Vorlagenspezialisierung und partieller Vorlagenspezialisierung. –

+1

Take-in-Zahl, die partielle Template-Spezialisierung funktioniert für Strukturen/Klassen, aber nicht für Funktionen (nur vollständige Spezialisierung für Funktionen) – max66

Antwort

1

Ihre Programmierung Frage zu beantworten:

template<typename T> 
int SaveLoad::Save(stringstream & saveStream, const T& input) 
{ 
    saveStream << input << Delimiter; 
    return 1; 
} 

template<typename T> 
int SaveLoad::Save(stringstream& saveStream, const vector<T>& input) 
{ 
    unsigned int length = input.size(); 
    Save(saveStream, length); 
    for (unsigned int i = 0; i < length; i++) 
    { 
    Save(saveStream, input[i]); 
    } 
    return 1; 
} 

die breitere Frage über die Serialisierung zu beantworten: Kasse cereal serialization library für C++.

Verwandte Themen