In C++ è possibile definire operatori di conversione che non sono membri della classe? So come farlo per gli operatori regolari (come +), ma non per gli operatori di conversione.Operatori di conversione definiti dall'utente C++ senza classi?
Ecco il mio caso d'uso: lavoro con una libreria C che mi consegna uno PA_Unichar *
, dove la libreria definisce PA_Unichar come int a 16 bit. In realtà è una stringa codificata in UTF-16. Voglio convertirlo in un codice std::string
codificato in UTF-8. Ho tutto il codice di conversione pronto e di lavoro, e sto manca solo lo zucchero sintattico che mi avrebbe permesso di scrivere:
PA_Unichar *libOutput = theLibraryFunction();
std::string myString = libOutput;
(di solito in una linea senza la variabile temp).
anche la pena notare:
so che
std::string
non definisce conversione implicita dachar*
e so perché. La stessa ragione potrebbe applicarsi qui, ma questo è oltre il punto.Ho una
ustring
, sottoclasse distd::string
che definisce l'operatore di conversione corretto daPA_Unichar*
. Funziona, ma questo significa utilizzare le variabiliustring
anzichéstd::string
e che quindi richiede la conversione instd::string
quando utilizzo quelle stringhe con altre librerie. Quindi questo non aiuta molto.L'utilizzo di un operatore di assegnazione non funziona come deve essere essere membri della classe.
Quindi è possibile definire operatori di conversione implicita tra due tipi che non controlli (nel mio caso PA_Unichar*
e std::string
), che possono o non possono essere tipi di classe?
In caso contrario, quali potrebbero essere soluzioni alternative?
cosa c'è che non va? Non molto, ma ancora due cose: - l'ingombro visivo, quando si hanno centinaia di chiamate senza senso per convertire - questa soluzione implica l'uso di una stringa temporanea std :: string. Ciò significa che i dati vengono copiati due volte, sempre. Questo può o non può essere un problema, ma non è molto soddisfacente. –
La maggior parte dei compilatori ottimizzerà la copia extra. – rlbond
jdmuys> rlbond ha ragione, il RVO è comune e reale nella pratica. Si potrebbe bacchetta leggere che: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ – Klaim