1

我有一个带有一些无处不在的数据结构的代码库;并且所述结构具有 std::string 成员。现在,出于某种原因,我希望这个代码库在 std::string 不可用时工作,实际上没有动态分配内存(至少不是通常的方式)。我还可以验证该字符串成员的字符串长度永远不会超过 M 个字符(并且 M 很小)。

现在,我应该用什么替换 std::string,这样我就不必做很多重写,一方面;并且我的约束在另一个方面得到满足?

笔记:

  • 我无法将字符串的计算移至编译时。
  • const char*如果解决方案只有一个普通的构造函数,一个构造函数,或者两者都有,那也没关系。
  • 涉及使用的解决方案std::string_view可能是相关的(但我不确定这是否有用)。
4

2 回答 2

3

char[M + 1]可能是一个不错的,简单的调查选择。重写的数量可能或多或少取决于您到目前为止使用字符串成员的方式。

如果成员的“std::stringiness”被大量使用,那么您可以通过实现一个提供与 类似接口std::string但内部使用的自定义类来减少重写量char[M + 1]Drew Dormannboost::static_string提到的就是此类的模板。

PS如果您仍然可以使用std::string并且只能使用动态内存,那么您可能会继续使用std::string自定义分配器,如Galik 所述

于 2021-06-18T16:42:46.027 回答
0

一个最小麻烦的潜在解决方案可以利用您的案例的细节,为了简单而牺牲一般性:

您编写的要替换的字符串实际上是另一个结构的成员。正如@eerorika 建议的那样,这已经允许使用结构的数组成员,而不必担心数组衰减。但是 - 数组不是 std::string 的接口。

您说您没有看到 anstd::string_view有什么用处 - 那是因为它没有存储空间。

好吧,将两者结合起来!...不,不要编写具有存储和字符串接口的新类。相反,将一个char [M+1]字段添加到您的结构中,使用一个新的字段名称,并将原始字段名称用于查看数组的 string_view(当然具有适当的长度)!

这使构造和赋值有点复杂——即它不再是简单的成员构造——但你将能够传递这个对象并使用与以前相同的字段,如 std::string。

  struct ubiquitous {
     // other members
     char[M+1] string_data;
     std::string_view original_field;

     // apply rule of 5: ctor, move ctor, assignment, move assignment
     // and a trivial dtor (at least for your two fields)
     // ... so, a "rule of 4" in this case
  };

如果您没有string_view可用的,即 C++17 之前的代码,那么您可以获取Martin Moene 的反向移植 string_view (GitHub)。

于 2021-06-18T17:05:35.413 回答