隐式转换的C++字符串类
问题描述:
我有几个字符串类可以隐式转换为字符串。我有这些用途的几个;一个例子是,认为需要在运行时gettext翻译文本:隐式转换的C++字符串类
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
,然后例B编译失败,他说,有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*
。您不必担心释放问题,您手中的数据“消失”等。
答
您必须放弃拥有operator const char *
。请将其作为explicit
(C++ 11),或者将其作为c_str
方法提供。
不允许将TranslatableString
转换为const char *
至std::string
,因为它包含两个用户定义的转换。
有道理。谢谢。 (这个特殊的类只用于字符串文字,所以'const char *'很好;在其他地方,我几乎总是使用'std :: string'。) – 2013-04-05 16:39:51