Mam kilka klas łańcuchowych, które można niejawnie przekonwertować na ciągi. Mam kilka zastosowań dla nich; Jednym z przykładów jest trzymać tekst, który musi być tłumaczone w czasie wykonywania przez gettext:Klasa podobna do łańcucha C++ z niejawną konwersją
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_;
};
Teraz staram się zrobić za pomocą tej klasy jak najprostsze (czyli z użyciem powinno być tak samo jak struna dosłownym jak to możliwe). W szczególności chciałbym, aby oba następujące przykłady użycia działały:
const TranslatableString HELLO = TranslatableString("Hello, world!");
std::string ExampleA() {
return HELLO;
}
void ExampleB() {
std::string s;
s = HELLO;
}
Czy istnieje sposób, aby oba przykłady działały?
- Gdybym to
operator std::string
, następnie ExampleB nie skompilować, mówiąc, że istnieje pewna dwuznaczność pomiędzystd::string::operator=(const char *)
istd::string operator=(const std::string&)
(co ma sens). - Jeśli nie dodaję
operator std::string
, to nie można skompilować przykładuA; pozornie niejawna konwersja TranslatableString na const char * na std :: string nie jest dozwolona, chociaż nie rozumiem niejawnych zasad konwersji C++ na tyle dobrze, aby wyjaśnić dlaczego.
Ma sens. Dzięki. (Ta klasa jest przeznaczona tylko do użycia z literałami łańcuchowymi, więc 'const char *' jest w porządku, gdzie indziej, prawie zawsze używam 'std :: string'.) –