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).

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top