In C++ ist es möglich, Konvertierungsoperatoren zu definieren, die keine Klassenmitglieder sind? Ich weiß, wie man das für reguläre Operatoren (wie +) macht, aber nicht für Konvertierungsoperatoren.C++ benutzerdefinierte Konvertierungsoperatoren ohne Klassen?
Hier ist mein Anwendungsfall: Ich arbeite mit einer C-Bibliothek, die mir eine PA_Unichar *
aushändigt, wo die Bibliothek PA_Unichar zu einem 16-Bit-int definiert. Es ist eigentlich eine Zeichenfolge, die in UTF-16 codiert ist. Ich möchte es in eine std::string
konvertieren, die in UTF-8 codiert ist. Ich habe alle der Conversion-Code bereit und arbeiten, und ich bin nur die syntaktische Zucker fehlen, die mir schreiben lassen würde:
PA_Unichar *libOutput = theLibraryFunction();
std::string myString = libOutput;
(in der Regel ohne die temporäre Variable in einer Zeile).
Auch erwähnenswert:
Ich weiß, dass
std::string
nicht implizite Konvertierung vonchar*
nicht definiert, und ich weiß, warum. Der gleiche Grund könnte hier gelten, aber das ist nebensächlich.Ich habe eine
ustring
, Unterklasse vonstd::string
, die den richtigen Konvertierungsoperator ausPA_Unichar*
definiert. Es funktioniert, aber dies bedeutetustring
Variablen anstelle vonstd::string
und dann erfordert Konvertierung instd::string
, wenn ich diese Zeichenfolgen mit anderen Bibliotheken verwenden. Das hilft also nicht sehr.Die Verwendung eines Zuweisungsoperators funktioniert nicht, da Klassenmitglieder sein müssen.
So ist es möglich, implizite Konvertierung Operatoren zwischen zwei Typen definieren Sie nicht kontrollieren (in meinem Fall PA_Unichar*
und std::string
), die nicht Klassentypen sind oder nicht?
Wenn nicht, was könnte Workarounds sein?
was ist los? Nicht viel, aber immer noch, zwei Dinge: - das visuelle Durcheinander, wenn Sie Hunderte von sinnlosen Calls zu konvertieren haben - diese Lösung impliziert die Verwendung eines temporären std :: string. Dies bedeutet, dass die Daten die ganze Zeit zweimal kopiert werden. Dies kann oder kann kein Problem sein, ist aber nicht sehr befriedigend. –
Die meisten Compiler optimieren die zusätzliche Kopie. – rlbond
jdmuys> rlbond ist richtig, RVO ist in der Praxis üblich und real. Sie könnten wandeln, um das zu lesen: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ – Klaim