作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有几个可以隐式转换为字符串的类字符串类。我对这些有一些用途;一个例子是保存需要在运行时由 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*
。您不必担心重新分配问题、数据在您手中“消失”等问题。
关于具有隐式转换的 C++ 类字符串类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15838153/
我是一名优秀的程序员,十分优秀!