J'ai deux ou trois classes filiformes qui peuvent être convertis de façon implicite à cordes. J'ai quelques utilisations pour ceux-ci; un exemple est de contenir du texte qui doit être traduit à l'exécution par gettext:chaîne comme ++ C classe avec conversion implicite
class TranslatableString
{
public:
explicit TranslatableString(const char *s) : native_text_(s) {}
operator const char *() const { return gettext(native_text_); }
// Or not - see below:
operator const std::string() const { return gettext(native_text_); }
private:
const char * const native_text_;
};
Maintenant, je suis en train de faire en utilisant cette classe aussi simple que possible (par exemple, son utilisation doit être aussi un peu comme une chaîne littérale possible). En particulier, je voudrais que les deux usages des exemples suivants pour travailler:
const TranslatableString HELLO = TranslatableString("Hello, world!");
std::string ExampleA() {
return HELLO;
}
void ExampleB() {
std::string s;
s = HELLO;
}
Est-il possible de faire les deux exemples fonctionnent-ils?
- Si je
operator std::string
inclus, alors ExampleB ne parvient pas à compiler, en disant qu'il ya une ambiguïté entrestd::string::operator=(const char *)
etstd::string operator=(const std::string&)
(ce qui est logique). - Si je n'inclue pas
operator std::string
, alors ExampleA ne peut pas être compilé; la conversion apparemment implicite d'un TranslatableString en const char * en std :: string n'est pas autorisée, bien que je ne comprenne pas assez bien les règles de conversion implicite de C++ pour expliquer pourquoi.
Fait sens. Merci. (Cette classe particulière est uniquement conçue pour être utilisée avec des littéraux de chaîne, donc 'const char *' est correct, ailleurs, j'utilise presque toujours 'std :: string'.) –