Question

Je le code suivant, qui utilise une classe de chaîne Unicode à partir d'une bibliothèque que j'écris:

#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());
}

La méthode de codage des instances de classe ustring convertit l'Unicode interne en UTF-8 char *. Cependant, parce que je n'ai pas accès à la définition de classe de char, je ne suis pas sûr de la façon dont je peux définir une conversion de type implicite (de sorte que je n'ai pas encode d'appel manuellement lors de l'utilisation avec printf, etc.).

Était-ce utile?

La solution

Tout d'abord, je vous recommande de ne pas fournir que considérer une conversion implicite. Vous pouvez constater que les situations dans lesquelles les conversions inattendues ne sont pas surpris en train d'erreurs l'emporte sur le coût de l'appel encode lorsque vous voulez un char*.

Si vous décidez de fournir une conversion implicite que vous déclarez comme ceci (dans votre définition de classe.

operator char*();

Vous pourriez être en mesure de faire la méthode const, dans ce cas, vous pouvez utiliser:

operator char*() const;

Généralement, vous aussi envie de revenir un pointeur vers un tampon non modifiable:

operator const char*() const;

Dans le corps de votre fonction, vous devriez return un pointeur approprié. En tant que clients de conversion implicite ne soupçonniez pas avoir à libérer le tampon renvoyé si vous avez besoin de faire un tampon spécial pour la valeur de votre retour, vous devrez maintenir un pointeur vers ce tampon jusqu'à ce qu'un point approprié pour le libérer. Généralement, un tel moment approprié pourrait être l'opération suivante mutationniste sur votre objet de classe.

Notez que printf prend un nombre et le type d'arguments optionnels que vous auriez encore besoin de jeter votre objet de classe dans tous les cas.

printf("%s\n", static_cast<const char*>(a + b + c[1] + d));

ou

printf("%s\n", (const char*)(a + b + c[1] + d));

Ces deux éléments sont plus bavard un appel explicite à encode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top