Come faccio a definire un typecast implicita da mia classe ad uno scalare?
Domanda
Ho il codice seguente, che utilizza una classe stringa Unicode da una libreria che sto scrivendo:
#include <cstdio>
#include "ucpp"
main() {
ustring a = "test";
ustring b = "ing";
ustring c = "- -";
ustring d;
d = "cafe\xcc\x81";
printf("%s\n", (a + b + c[1] + d).encode());
}
Il metodo di codifica delle istanze di classe ustring converte l'Unicode interno in un UTF-8 char *. Tuttavia, poiché non ho accesso alla definizione di classe char, io sono sicuro su come posso definire un typecast implicita (in modo che io non devo chiamata codificare manualmente quando si utilizza con printf, ecc).
Soluzione
In primo luogo, vi consiglio di prendere in considerazione non fornire una conversione implicita. Potreste scoprire che le situazioni in cui le conversioni inaspettate non vengono catturati come errori supera il costo della chiamata encode
quando si desidera una char*
.
Se si decide di fornire una conversione implicita si dichiara in questo modo (dentro la tua definizione di classe.
operator char*();
Si potrebbe essere in grado di fare il metodo const, nel qual caso è possibile utilizzare:
operator char*() const;
Di solito si potrebbe anche voler restituire un puntatore a un buffer non modificabile:
operator const char*() const;
Nel corpo della funzione si dovrebbe return
un puntatore appropriata. Come un implicito clienti di conversione non si aspettano di dover liberare il buffer restituito quindi se avete bisogno di fare uno speciale buffer per il valore di ritorno si dovrà mantenere un puntatore a questo buffer fino a un punto adatto per liberarlo. Tipicamente un momento così adatto potrebbe essere la prossima operazione mutante sul vostro oggetto classe.
Si noti che come printf
prende qualsiasi numero e tipo di argomenti opzionali si sarebbe ancora bisogno di esprimere il vostro oggetto di classe in ogni caso.
printf("%s\n", static_cast<const char*>(a + b + c[1] + d));
o
printf("%s\n", (const char*)(a + b + c[1] + d));
Entrambi questi sono più dettagliato di una chiamata esplicita a encode
.