Jos*_*ley 6 c++ string operator-overloading implicit-conversion
我有几个类似字符串的类,可以隐式转换为字符串.我对这些有一些用处; 一个例子是保存需要在运行时由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_;
};
Run Code Online (Sandbox Code Playgroud)
现在我正在努力使这个类尽可能简单(即,使用它应该尽可能像字符串文字).特别是,我希望以下两个示例用法都能正常工作:
const TranslatableString HELLO = TranslatableString("Hello, world!");
std::string ExampleA() {
return HELLO;
}
void ExampleB() {
std::string s;
s = HELLO;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让两个例子都有效?
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++的隐式转换规则来解释原因.每个转换序列中只允许一个用户定义的转换,这就是为什么你不能"通过"a const char*.(注意,const char*to std::string也是用户定义的转换).
你需要转换成const char*?如果没有它(并且转向std::string),这两个例子都可行.
也许值得考虑将数据存储在std::string内部,而不是const char*.您不必担心解除分配问题,数据"消失"在您手中等.