Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » template: value-/pointertype

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
22.12.2010, 22:21 Uhr
Lensflare



Hi.

ich habe im Netz eine interessante Möglichkeit gefunden, strings zusammenzubauen
und wollte sie noch etwas anpassen und erweitern:


C++:
#include <string>
#include <sstream>

class StringBuilder {
private:
    std::ostringstream oss;

public:
    template <typename T>
    StringBuilder& operator<<(const T& v) {
        oss << v;
        return *this;
    }

    // funktioniert nicht
    StringBuilder& operator<<(void* v) {
        oss << "(adr:";
        if(v != NULL) {
            oss << v;
        } else {
            oss << "NULL";
        }
        oss << ")";
        return *this;
    }

    StringBuilder& operator<<(bool v) {
        oss << (v ? "true" : "false");
        return *this;
    }

    operator std::string() const {
        return oss.str();
    }
};



Der << operator nimmt also jeden beliebigen Typ und dann habe ich noch eine Spezialisierung für bool eingebaut.
Ich würde auch gerne noch eine Spezialisierung für alle Zeigertypen einbauen, aber ich weiss nicht wie.

So wie es jetzt ist, werden Zeigertypen schon durch "const T&" abgefangen. Der "operator<<(void* v)" kommt also nie zum Einsatz.

Die Klasse soll dann so verwendet werden:


C++:
void f(std::string s) {
  //...
}

//...

int n = 1;
bool b = true;
int *p = new int(2);

f(StringBuilder() << "test " << n << " " << b << " " << p);



Ich befürchte dass es generell nicht möglich ist, value types und pointer types auseinanderzuhalten, aber vielleicht kennt ja jemand eine Lösung.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.12.2010, 13:07 Uhr
Dobi



Hi Lensflare,

deine Memberfunktion nimmt einen void*, du versucht aber, einen int* zu übergeben.

Also, entweder

C++:
StringBuilder& operator<<(int* v) {

oder

C++:
f(StringBuilder() << "test " << n << " " << b << " " << static_cast<void*>(p));

oder etwas templatiges, wo du nicht für jeden Zeigertyp extra spezialisieren musst.

Gruß
Dobi

Edit: Falls dich die templatige Lösung lockt, könnte es passieren, dass du darüber stolperst, dass die Überladung bei spezialisierten Funktionstemplates nicht mehr funktioniert ( siehe: www.gotw.ca/publications/mill17.htm ).

Das ganze lässt sich aber über ne Hilfsfunktion in einem Klassentemplate machen. Ich hab dir das mal hier reingeschrieben: http://pastebin.com/C9L9cXDF

PS: Falls du dann irgendwann keine Lust mehr darauf hast, nakte Zeiger benutzen, lässt sich das ganze natürlich auch auf shared_ptr und co umschreiben.

Dieser Post wurde am 23.12.2010 um 13:49 Uhr von Dobi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.12.2010, 17:47 Uhr
Lensflare



Hi Dobi,


Zitat von Dobi:
oder etwas templatiges, wo du nicht für jeden Zeigertyp extra spezialisieren musst.

Ja genau. Nach sowas habe ich gesucht.

ich hatte es zuerst so probiert:

C++:
    template <typename T>
    StringBuilder& operator<<(const T& v) {
        oss << v;
        return *this;
    }
    
    template <>
    StringBuilder& operator<< <T*> (const T* v) {
        oss << "(adr:";
        if(v != NULL) {
            oss << v;
        } else {
            oss << "NULL";
        }
        oss << ")";
        return *this;
    }


aber da ich mit templates noch nicht so viel Übung habe, hat es da Fehler geregnet.

Ich werde mir auf jeden Fall noch den Artikel durchlesen um zu verstehen wieso man da eine Hilfklasse braucht.

Danke für die Hilfe.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 23.12.2010 um 17:48 Uhr von Lensflare editiert.
 
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: