Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Funktionsaufruf: Datentypen mischen?

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
24.08.2006, 09:10 Uhr
FunnyDingo



Hallo zusammen,

ich würde meine Applikation gerne mit einer Log-Funktion ausstatten. Dazu habe ich nun erstmal folgende Funktion (recht simple denke ich) geschrieben:

C++:
void log(const string &message) {
        
    struct timeval tvNow;
    time_t tNow;
    struct tm *tmNow;
    
    gettimeofday(&tvNow, NULL);
    time(&tNow);
    tmNow = localtime(&tNow);
    cout << setfill('0') << setw(2) << tmNow->tm_hour << ":" << setfill('0') << setw(2) << tmNow->tm_min << ":" << setfill('0') << setw(2) << tmNow->tm_sec << "." << tvNow.tv_usec << ": " << message << endl;
}

Das ganze soll dann später in eine Klasse die Log-Level pürft etc. Nun aber zu dem Problem:
Wenn ich die Funktion mit

C++:
log("Dies ist " + "ein Test");

aufrufe, klappt alles. Aber was, wenn ich z.B. Zahlen oder ein char-Array übergeben will?

C++:
read_bytes = 12;
log("Habe " + read_bytes + " bytes vom Socket gelesen");
char name[] = "FunnyDingo";
log("Der Name ist '" + name + "'");

Klappt leider nicht.

Hat da jemand eine Idee wie man so etwas lösen kann? Gibt es vielleicht sogar schon eine bekannte und gute Log-Klasse für c++?

Grüße,
FunnyDingo
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

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

Dieser Post wurde am 24.08.2006 um 09:11 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.08.2006, 09:47 Uhr
0xdeadbeef
Gott
(Operator)



Zitat von FunnyDingo:

C++:
log("Dies ist " + "ein Test");



Ich bezweifle ernsthaft, dass das so kompiliert...

Wie dem auch sei, es gibt an der Stelle mehrere mögliche Rangehensweisen. Meine erste Idee wäre eine Klasse, die einen Stream kapselt und einen operator<< bereitstellt, der den timestamp schreibt und den Stream für weitere Ausgabe zurückgibt. In etwa so:

C++:
#include <ctime>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>

std::string timestamp(std::tm const &ts) {
  std::ostringstream osstr;

  osstr << '['
    << std::setfill('0') << std::setw(2) << ts.tm_hour << ':'
    << std::setfill('0') << std::setw(2) << ts.tm_min  << ':'
    << std::setfill('0') << std::setw(2) << ts.tm_sec << ']';
  return osstr.str();
}

class log {
public:
  log(std::ostream &os) : os_(os) { }

  template<typename T> std::ostream &operator<<(T const &t) {
    std::time_t now;
    std::tm tm_now;

    time(&now);
    localtime_r(&now, &tm_now);
    
    return os_ << timestamp(tm_now) << ' ' << t;
  }

private:
  std::ostream &os_;
};

int main() {
  log mylog(std::cerr);

  mylog << "foo " << 2 << 3 << 4 << std::endl;
  mylog << "foo " << 2 << 3 << 4 << std::endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.08.2006, 10:31 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)



Zitat von 0xdeadbeef:
Ich bezweifle ernsthaft, dass das so kompiliert...

Je nachdem,was er mit operator+ gemacht hat ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.08.2006, 11:07 Uhr
0xdeadbeef
Gott
(Operator)


Für Basistypen kann man Operatoren nicht überladen, mindestens einer der Operanden muss ein Klassentyp sein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: