【问题标题】:A portable, std::string-like string class which is not std::string一个可移植的、类似于 std::string 的字符串类,它不是 std::string
【发布时间】:2016-10-04 17:06:36
【问题描述】:

出于各种(C++11 std::string-change-related)原因,我想在我的 C++11-ish 代码的某些地方使用非 std::string 字符串类,这需要可以接受多个 C++ 编译器的多个版本。

现在,我真的不介意我的字符串是以 C++11 之前的风格还是 C++11 之后的方式表现的;而且我也不关心性能。我只想要一个不错的可靠字符串类,它在任何情况下都不会给我带来涉及std::__cxx11::string 和其他此类巫术的错误。

我有哪些选择?我可以/应该在我自己的头文件中复制一些单一编译器的实现吗? GCC 的 vstring 是一个选项吗?还有什么?

【问题讨论】:

  • 什么是“类字符串”?你说你不关心差异——C++11 做出改变的部分原因是新版本更加线程安全。你能澄清一下你具体想要什么吗?您只是希望它可以转换为两种类型的字符串吗?为什么不能在项目中合适的任何边界在两种类型之间进行转换,为什么需要第三种类型的字符串。为什么你不能使用新的字符串类型在 C++11 中重新编译所有代码和相关库,而忘记整个混乱。
  • @ChrisBeck:假设它实现了std::string 的方法。或者,如果我想更谦虚一点 - 可以用作映射键并具有 .c_str() 的等价物。线程安全不是必须的。
  • 我认为你提到的所有可能性都是选项?该问题没有包含足够的信息来消除其中任何一个问题。您当然可以扮演自己的角色,它可以用作地图键,并在 5 分钟或更短的时间内拥有.c_str()
  • @ChrisBeck 或者真的,继承或拥有一个std::vector<char> 并让.c_str() 在它的末尾插入一个\0 如果缺少。将operator< 转发给它,完成。

标签: string c++11 compatibility stdstring vstring


【解决方案1】:
template<class T>
struct crappy_string {
  mutable std::vector<T> buffer;
  T const* c_str() const {
    if (buffer.empty() || buffer.back())
      buffer.push_back(0);
    return buffer.data();
  }
  friend bool operator<( crappy_string const& lhs, crappy_string const& rhs ) {
    lhs.c_str(); rhs.c_str(); // ensure null terminator in both
    return lhs.buffer < rhs.buffer;
  }    
};

这满足您在 cmets 中给出的最低要求。

【讨论】:

  • 这仅适用于有序地图。但是点了。我想我不应该放弃 cmets 中的所有这些方法,这不是讨价还价 :-(
猜你喜欢
  • 2017-01-26
  • 2012-07-26
  • 2020-05-15
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2016-12-12
相关资源
最近更新 更多