隐式转换的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*。您不必担心释放问题,您手中的数据“消失”等。

+0

有道理。谢谢。 (这个特殊的类只用于字符串文字,所以'const char *'很好;在其他地方,我几乎总是使用'std :: string'。) – 2013-04-05 16:39:51

您必须放弃拥有operator const char *。请将其作为explicit(C++ 11),或者将其作为c_str方法提供。

不允许将TranslatableString转换为const char *std::string,因为它包含两个用户定义的转换。