Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Nerviges Problem mit std::string und int

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.09.2009, 19:49 Uhr
FunnyDingo



Hallo zusammen,

ich habe eine Logger-Klasse. Die Log-Funktion nimmt zwei Parameter entgegen, beide std::string. Nun habe ich ein Problem, wenn ich Zahlen übergeben möchte.

C++:
int i = 5;
logger.log("Module Name", "Der neue Status ist: " + std::string(i));

Das geht ja nicht. Ich finde es auch ehrlich gesagt ziemlich nervig, vorher jedes mal mit ostringstream oder sprintf zu arbeiten. Gibt es da nicht eine bessere Lösung?

Gruß,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.09.2009, 20:32 Uhr
0xdeadbeef
Gott
(Operator)


Etwa so:

C++:
template<typename to, typename from> to(from const &x) {
  to result;
  std::stringstream converter;

  converter << x;
  converter >> result;

  if(!converter) {
    throw std::invalid_argument("Konvertierung fehlgeschlagen");
  }

  return result;
}

// ...

logger.log("Modulname", "Der neue Status ist: " + convert<std::string>(i));


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.09.2009, 21:51 Uhr
FunnyDingo



Das sieht doch schon vieeeel besser aus. Danke
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.09.2009, 23:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hmm mal nur so ne frage, geht dann nicht auch direkt so:


C++:
logger.log("Modulname", "Der neue Status ist: " + convert(i));



also ohne manuelle angabe des template parameters? weil im prinzip dürfte er das doch vervollständigen oder? oder würde er das auf "int/int" vervollständigen?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.09.2009, 03:32 Uhr
0xdeadbeef
Gott
(Operator)


Der Rückgabetyp lässt sich nicht aus den Parametern herleiten. Du kannst natürlich so was wie

C++:
template<typename from_t> std::string to_string(from_t const &x) {
  std::ostringstream converter;

  out << x;

  if(!out) {
    throw std::invalid_argument("Konvertierung fehlgeschlagen");
  }

  return out.str();
}


benutzen, aber wenn's sowieso generisch ist, warum dann nicht richtig?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.09.2009 um 03:34 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.09.2009, 14:38 Uhr
FunnyDingo



Ich habe es auch "nur" mit Rückgabe std::string implementiert. Aber eine Frage hätte ich dazu noch:

So hätte ich es gerne, geht aber nicht (bekomme "undefined reference"). Liegt es daran weil es ein template ist?
string.h
C++:
namespace yac {
namespace string {
template<typename from> std::string convert(from const &);
std::vector<std::string> explode(std::string, std::string);
}
}

string.cpp
C++:
template<typename from> std::string yac::string::convert(from const &x)
{
    std::ostringstream converter;

    converter << x;

    if(!converter)
        throw std::invalid_argument("convert failed");

    return converter.str();
}

std::vector<std::string> yac::string::explode(std::string s, std::string e)
{
    std::vector<std::string> ret;
    size_t iPos = s.find(e, 0);
    size_t iPit = e.length();

    while(iPos != std::string::npos)
    {
        if(iPos!=0)
            ret.push_back(s.substr(0,iPos));
        s.erase(0,iPos+iPit);
        iPos = s.find(e, 0);
    }
    if(s!="")
        ret.push_back(s);
    return ret;
}

--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 13.09.2009 um 14:41 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.09.2009, 15:09 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


templates müssen immer in den header. da der code beim instanzieren bekannt sein muss
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.09.2009, 15:24 Uhr
FunnyDingo



Da war meine Vermutung dann ja doch richtig. Schade...
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.09.2009, 22:49 Uhr
0xdeadbeef
Gott
(Operator)


Du kannst es in Übersetzungseinheiten für einzelne Typen konkretisieren; dann muss der Code nicht in den Header, solange du die Funktion nur für diese Typen benutzt. Ich sehe in diesem Fall allerdings nicht, wozu das gut sein soll.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.09.2009 um 22:49 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.09.2009, 15:56 Uhr
FunnyDingo



Stimmt, würde hier keinen Sinn machen. So ist das schon OK so. Hätte nur gerne der Ordnung wegen die Definition in der cpp gehabt. Aber man kann halt nicht immer alles haben
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: