我有几个类似字符串的类,可以将其隐式转换为字符串。我有一些用途。一个示例是保留需要在运行时由gettext翻译的文本:
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_;
};
现在,我试图使使用此类尽可能简单(即,使用它应该尽可能像字符串文字一样)。特别是,我希望以下两个示例用法都能正常工作:
const TranslatableString HELLO = TranslatableString("Hello, world!");
std::string ExampleA() {
return HELLO;
}
void ExampleB() {
std::string s;
s = HELLO;
}
有什么办法可以使这两个示例正常工作吗?
operator std::string
,则ExampleB无法编译,并说std::string::operator=(const char *)
和std::string operator=(const std::string&)
之间存在歧义(这是有道理的)。 operator std::string
,则ExampleA无法编译;显然不允许将TranslatableString隐式转换为const char *转换为std::string,尽管我不太了解C++的隐式转换规则来解释原因。 最佳答案
每个转换序列中仅允许一个用户定义的转换,这就是为什么您不能“通过” const char*
的原因。 (请注意,从const char*
到std::string
也是用户定义的转换)。
您需要转换为const char*
吗?没有它(并且覆盖std::string
),两个示例都可以工作。
还可能需要考虑在内部将数据存储为std::string
而不是const char*
。您不必担心重新分配问题,数据在您的手下“消失”等。