2010-05-02 5 views
0

J'ai le code suivant, qui utilise une classe de chaîne Unicode à partir d'une bibliothèque que je vous écris:Comment définir un transtypage implicite de ma classe sur un scalaire?

#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 encode 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 la classe char, je ne suis pas sûr de la façon dont je peux définir un transtypage implicite (de sorte que je n'ai pas à appeler manuellement encoder lors de l'utilisation avec printf, etc.).

Répondre

7

Tout d'abord, je vous recommande de ne pas fournir de conversion implicite. Vous pouvez constater que les situations où les conversions inattendues ne sont pas détectées comme des erreurs l'emportent sur le coût d'appel encode lorsque vous souhaitez un char*.

Si vous décidez de fournir une conversion implicite vous déclarer 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 pouvez également retourner un pointeur vers un tampon non modifiable:

operator const char*() const; 

Dans le corps de votre fonction, vous devriez return un pointeur approprié. Comme une conversion implicite ne s'attend pas à ce que les clients libèrent le tampon retourné, si vous devez créer un tampon spécial pour votre valeur de retour, vous devrez maintenir un pointeur vers ce tampon jusqu'à un point approprié pour le libérer. Généralement, un tel moment peut être l'opération de mutation suivante sur votre objet de classe.

Notez que printf prend n'importe quel nombre et type d'arguments facultatifs dont vous auriez toujours besoin de cast 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.

+0

+1 Bien meilleure explication que la mienne :) – AraK

+0

Merci beaucoup pour les conseils. Je vais réfléchir sur les avantages/inconvénients et tester si un implicite est vraiment bénéfique. –

+0

(Je suis désolé de ne pas avoir encore reçu votre réponse, donc je limite ma fréquence d'acceptation donc je dois attendre quelques minutes) –

Questions connexes