一个最小麻烦的潜在解决方案可以利用您的案例的细节,为了简单而牺牲一般性:
您编写的要替换的字符串实际上是另一个结构的成员。正如@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)。