implizite Umwandlung von std::string zu const char *



  • Hallo,

    kann man std::string implizit zu const char * umwandeln lassen? Also Beispiel Funktion erwartet Argument const char *, ich habe aber einen std::string, kann dann der Compiler std::string::c_str() automatisch ersetzen?

    Beispiel:

    try {
      throw std::string("fehler");
    } catch (const char * e) {
      std::cerr << e << std::endl;
    }
    

    Sprich ich weiß an dieser Stelle nicht was geworfen wird, außer dass es ein String sein muss.



  • kann man std::string implizit zu const char * umwandeln lassen? Also Beispiel Funktion erwartet Argument const char *, ich habe aber einen std::string, kann dann der Compiler std::string::c_str() automatisch ersetzen?

    Nein.



  • Okay danke. Rein interessehalber wenn man den Casting-Operator entsprechend überlädt, funktioniert es dann?



  • Ja. Aber CastOps sind eigentlich nie wirklich eine gute Idee. Damit stellt man sich einfach zu gerne ein Bein.

    zB

    std::string s;
    if(s)
    

    (Aus dem Grund sind die impliziten bool-Konvertierungen zB bei den boost Smartpointern so umständlich. In C++0x wird aber alles besser: http://en.wikipedia.org/wiki/C%2B%2B0x#Explicit_conversion_operators )



  • Es gibt keine Casting Operatoren, es gibt nur Konvertierungs-Operatoren.
    Und die kann man nicht überladen, gibt ja auch nix zu überladen.
    Und deklarieren kann man sie nur innerhalb der Klasse.
    Du müsstest also den Code vom std::string ändern, und das "tut man nicht".



  • hustbaer schrieb:

    Es gibt keine Casting Operatoren, es gibt nur Konvertierungs-Operatoren.

    Das sollte ich mir wohl mal genauer ansehen. Mir ist nicht so klar, was du mit dieser Aussage genau sagen willst.

    Und die kann man nicht überladen, gibt ja auch nix zu überladen.

    Es scheitert sicher auch hier an meiner Unwissenheit, aber folgende Methode hat man mir als Casting-Operator beigebracht:

    class Foo
    {
      Bar bar();
      operator Bar()
      {
        return bar();
      }
    }
    

    Und deklarieren kann man sie nur innerhalb der Klasse.
    Du müsstest also den Code vom std::string ändern, und das "tut man nicht".

    Ich glaube ich komme dir schon näher, aber das wollte ich auch nicht, deswegen ja auch interessehalber.



  • Nick Unbekannt schrieb:

    hustbaer schrieb:

    Es gibt keine Casting Operatoren, es gibt nur Konvertierungs-Operatoren.

    Das sollte ich mir wohl mal genauer ansehen. Mir ist nicht so klar, was du mit dieser Aussage genau sagen willst.

    OK, ist natürlich so wie es dasteht falsch.

    Klar gibt es casting Operatoren, aber die kann man nicht überladen und auch nicht definieren, die sind einfach eingebaut.

    Das was man definieren kann nennt sich "conversion operator".

    Das wollte ich damit sagen.

    Nick Unbekannt schrieb:

    folgende Methode hat man mir als Casting-Operator beigebracht:

    class Foo
    {
      Bar bar();
      operator Bar()
      {
        return bar();
      }
    }
    

    Jo, das "operator Bar" Ding ist ein sog. "conversion operator".

    Ich hab aber grad kurz gegoogelt. Scheint nicht unüblich zu sein das Deklarieren von "conversion operators" als "overloading the cast operator(s)" zu bezeichnen. Ich finde es allerdings falsch/ungenau.


Anmelden zum Antworten