En C++ est-il possible de définir des opérateurs de conversion qui ne sont pas des membres de classe? Je sais comment faire pour les opérateurs réguliers (tels que +), mais pas pour les opérateurs de conversion.Opérateurs de conversion C++ définis par l'utilisateur sans classes?
Voici mon cas d'utilisation: Je travaille avec une bibliothèque C qui me distribue un PA_Unichar *
, où la bibliothèque définit PA_Unichar comme un int 16 bits. C'est en fait une chaîne codée en UTF-16. Je veux le convertir en un std::string
codé en UTF-8. J'ai tout le code de conversion prêt et de travail, et je ne manque que le sucre syntaxique qui me permettrait d'écrire:
PA_Unichar *libOutput = theLibraryFunction();
std::string myString = libOutput;
(habituellement dans une ligne sans la variable temp).
A noter également:
Je sais que
std::string
ne définit pas la conversion implicite dechar*
et je sais pourquoi. La même raison pourrait s'appliquer ici, mais ce n'est pas la question. J'ai uneustring
, sous-classestd::string
qui définit l'opérateur de conversion correct à partir dePA_Unichar*
. Cela fonctionne mais cela signifie utiliserustring
variables au lieu destd::string
et que puis nécessite la conversion àstd::string
lorsque j'utilise ces chaînes avec d'autres bibliothèques. Cela n'aide pas beaucoup. L'utilisation d'un opérateur d'assignation ne fonctionne pas car les doivent être des membres de la classe.
est-il donc possible de définir des opérateurs de conversion implicite entre deux types que vous ne contrôlez pas (dans mon cas PA_Unichar*
et std::string
), qui peuvent ou peuvent ne pas être les types de classe?
Si ce n'est pas ce qui pourrait être des solutions de contournement?
Qu'est-ce qui ne va pas? Pas grand-chose, mais quand même, deux choses: - l'encombrement visuel, quand vous avez des centaines d'appels sans signification à convertir - cette solution implique l'utilisation d'une chaîne temporaire std :: string. Cela signifie que les données sont copiées deux fois, tout le temps. Cela peut ou peut ne pas être un problème, mais n'est pas très satisfaisant. –
La plupart des compilateurs optimiseront la copie supplémentaire. – rlbond
jdmuys> rlbond a raison, RVO est commun et réel dans la pratique. Vous pourriez vouloir lire ceci: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ – Klaim