【问题标题】:C++ string-like class with implicit conversion具有隐式转换的 C++ 类字符串类
【发布时间】:2013-04-05 15:45:46
【问题描述】:

我有几个可以隐式转换为字符串的类字符串类。我对这些有一些用途;一个例子是保存需要在运行时由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++ 的隐式转换规则来解释原因。

【问题讨论】:

    标签: c++ string operator-overloading implicit-conversion


    【解决方案1】:

    每个转换序列中只允许一个用户定义的转换,这就是为什么您不能“通过”const char*。 (注意const char*std::string也是用户自定义的转换)。

    您需要转换为const char* 吗?没有它(并且覆盖到std::string),这两个例子都可以工作。

    可能还值得考虑将数据存储为内部std::string,而不是const char*。您不必担心释放问题、数据“消失”在您手下等问题。

    【讨论】:

    • 有道理。谢谢。 (这个特定的类只设计用于字符串文字,所以const char * 很好;在其他地方,我几乎总是使用std::string。)
    【解决方案2】:

    您将不得不放弃拥有operator const char *。将其设为 explicit (C++11) 或将其作为 c_str 方法提供。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多