2009-07-15 4 views
4

Comment créer quelque chose comme __repr__ en Python? Disons que j'ai un object1 de SomeClass, disons que j'ai une fonction void function1(std::string). Existe-t-il un moyen de définir quelque chose (fonction, méthode, ...) pour rendre la classe de cast du compilateur SomeClass à std::string lors de l'appel de function1(object1)?Transtypage personnalisé en C++ (comme __repr__ en Python)

(je sais que je peux utiliser un tampon stringstream et l'opérateur < <, mais j'aimerais trouver un moyen sans opération intermédiaire comme ça)

Répondre

11

Définir un opérateur de conversion:

class SomeClass { 
public: 
    operator std::string() const { 
     return "SomeClassStringRepresentation"; 
    } 
}; 

Notez que cela ne fonctionnera pas seulement dans les appels de fonction, mais dans un contexte le compilateur essaierait de faire correspondre le type avec std::string - en initialisations et les affectations, les opérateurs, etc. Faites donc attention à cela, car il est trop facile de rendre le code difficile à lire avec beaucoup de conversions implicites.

+0

Attention: Bien que '__repr__' puisse être un Python idiomatique, ce qui précède n'est certainement pas du langage C++ idiomatique et va perturber le lecteur de code s'il n'est pas utilisé judicieusement. –

+0

EDIT: La réponse de Pavel est bien sûr tout à fait correcte, c'est la mention de '__repr__' qui a sonné ma sirène d'avertissement :) –

7

Utilisez un opérateur de conversion. Comme ceci:

class SomeClass { 
public: 
    operator string() const { //implement code that will produce an instance of string and return it here} 
};