Funkions-Template in Klassentemplate umwandeln?

  • Funkions-Template in Klassentemplate umwandeln?

    Hallo,

    ich bins nochmal.. ich habe bemerkt dass mein Funktionstempalte zur Umwandlung von verschiedenen Typen nicht funtktionieren kann.. da bei Strings ja nur bis zum ersten Whitespace eingelesen wird.. nun muss ich also teilweise spezialisieren.. ich weiß nur nicht wie ich das machen könnte.. wie bekomme ich aus meinen Funktionstemplate ein Klassentemplate, welches Strings inkl whitespace einlesen kann?

    Quellcode

    1. template <typename To, typename From>To stream_cast(From input)
    2. {
    3. std::stringstream str;
    4. str << input;
    5. To output;
    6. str >> output;
    7. if( !str.eof() )
    8. throw std::bad_cast("bad stream_cast");
    9. return output;
    10. }
    11. //Spezialisierung für gleiche Typen
    12. template<typename To> To stream_cast(const To &input)
    13. {
    14. return input;
    15. }
    16. //Spezialisierung string in char* -> wird nicht umgewandelt, input wird zurückgegeben
    17. template<> std::string stream_cast(const char* input)
    18. {
    19. return input;
    20. }
    Alles anzeigen
    Forza Italia!!!!!!
  • template<> std::string stream_cast(const char* input) ...

    wird er so nicht nehmen ....
    er braucht natuerlich unterschiedliche signaturen, sonst kann der compiler die typen ned aufloesen. der rueckgabewert einer funktion ist aber leider (logischer weisse) nicht teil der signatur.

    int f(int x); und char* f(int x); haben die selbe signatur und der compiler meckert dir doppelte definition an .


    template<typename To> To stream_cast(const To &input)
    {
    return input;
    }
    template<> std::string stream_cast(const char* input)
    {
    return input;
    }
    haben auch die selben signaturen .... -> doppelte definition wenn die dinger benutzt werden, bzw er kann ueberhaupt ned einschaaetzen ob er template 1 oder 2 nehmen soll, wenn mit std::string als rueckgabewert arbeitest.

    Loesung auf die schnelle ... deinen Rueckgabewert in die ddie Parameterliste schieben

    template <typename To, typename From>int stream_cast(const From &input, To & output)
    {
    }

    Ciao ...