Zusammenfassung von Funktionen mit Template realisierbar?



  • Hallo,

    gegeben:

    bool WriteParam_long (CString strParameterName, long lValue);
    bool WriteParam_double (CString strParameterName, double dValue);
    bool WriteParam_bool (CString strParameterName, bool bValue);
    bool WriteParam_string (CString strParameterName, CString strValue);
    

    In der WriteParam Funktion steht dabei die WritePrivateProfileString Funktion welche ja immer einen String benötigt.

    Der einzige Unterschied in den einzelnen Funktionen ist daß der Value mit der CString.Format entsprechend gewandelt werden muß.

    Ebenfalls sollen Funktion ala ReadParam_xxx zur Rückverwandlung vom String zum entsprechenden Datentyp erfolgen.

    Kann sowas mittels Funktions-Template gelöst werden ohne daß zuviele Spezialisierungen implementiert werden müssen?

    Ich denke daß das Hauptproblem darin besteht, daß man mit einem Ausdruck jedes beliebige Datenformat in einen String verwandeln muß. Gibt es sowas?



  • template<class T>
    bool WriteParam(const CString &param, T value)
    {
       // einen stringstream anlegen, mit 'stringstream << value' in nen string wandeln und dann weiter verwenden
    }
    

    Meep Meep



  • Oder mit boost::lexical_cast.

    #include <boost/lexical_cast.hpp>
    
    template<class T>
    void WriteParam(CString& strParameterName,T val) {
    	strParameterName.Format("%s",(boost::lexical_cast<std::string>(val)).c_str());
    }
    


  • Danke Meep Meep.

    Hat funktioniert. Jetzt noch die Rückverwandlung. 🙂



  • Hi,

    Nachtrag:

    der Kern der Wandlung sieht so aus:

    * Schreiben:

    template <typename T> bool WriteParam (CString strParameterName, T Value)
    std::stringstream strValue;
    
    strValue << Value;
    CString strBuffer(strValue.str().c_str());
    

    * Lesen:

    template <typename T>bool ReadParam (CString strParameterName, T &Value)
    CString strBuffer = "";
    std::stringstream strValue;
    
    std::string str((LPCTSTR)strBuffer);
    strValue << str;
    strValue >> Value;
    

    Funktioniert ausser bei CStrings (Spez nötig). Gibts da noch ne Verbesserung sodaß ein Algo alles abdecken kann oder kommt man um ne Spez nicht herum?


Anmelden zum Antworten