我有几个类似字符串的类,可以将其隐式转换为字符串。我有一些用途。一个示例是保留需要在运行时由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*。您不必担心重新分配问题,数据在您的手下“消失”等。

    10-07 13:21
    查看更多