【发布时间】:2021-03-14 11:21:29
【问题描述】:
注意:
我对我的问题进行了重大更改,使其更具体,但我会将旧问题保留在帖子末尾,以防它对任何人有用。
新问题
我正在开发一个嵌入式应用程序,它使用以下类型来表示字符串:
- 字符串字面量(默认为空终止)
- std::array
(非空终止) - std::string_view
我想要一个以统一方式接受所有这些的函数。唯一的问题是,如果输入是字符串文字,我将不得不用 strlen 计算大小,这在其他两种情况下都不起作用,但如果我使用 size,它在案例 1 中不起作用。
我应该使用这样的变体:std::variant<const char *,std::span<char>> 吗?强迫自己使用 std::visit 会很重吗?那东西甚至能正确匹配所有不同的字符串表示吗?
老问题
当我在以下上下文中提到“字符串”时的免责声明,我并不是指 std::string,而只是表示字母数字系列的一种抽象方式。
大多数情况下,当我必须在 c++ 中处理字符串时,我会使用 void func(const std::string &); 之类的东西,或者在某些情况下不使用 const 和引用。现在在嵌入式应用程序上,我无法访问 std::string 和我尝试使用std::string_view 问题是std::string_view 从非文字构造时有时不是空终止
编辑:我稍微改变了这个问题,因为 cmets 暗示了一些非常有帮助的提示。
因此,即使 y 在下面的示例中具有大小:
std::array<char,5> x{"aa"} ;
std::string_view y(x.data());
我不能将 y 与像 printf(%s,y.data()) 这样基于空终止的 c api 一起使用
#include <array>
#include <string_view>
#include "stdio.h"
int main(){
std::array<char,5> x{"aaa"};
std::string_view y(x.data());
printf("%s",x);
}
总结一下:
我能做些什么来实现一个堆栈分配的字符串,它在其构造函数中隐式地获取一个静态大小(来自空终止的字符串、字符串文字、string_views 和 std::arrays)并且它是可移动的(或廉价的可复制的)?
我的班级的基本类型是什么?与底层类型相比,速度成本是多少?
【问题讨论】:
-
std::array<char,5> x{"aa"} ;std::string_view(x.data());有什么问题? It works fine here -
理解英文描述的代码非常困难。此外,由于您还不知道解决方案,您的描述很可能无法解释对问题至关重要的部分。您能否展示一个 minimal reproducible example 来突出显示您在使用
std::array<char,5> x{"aa"} ;std::string_view(x.data());时遇到的任何问题? -
我无法理解您所说的可移动是什么意思?
std:: string_view顾名思义;抽象字符串的 const 视图。作为一种观点,它是可复制的。std::span可以用作可变的替代方案 - 但作为查看原始字符串的参考。但是底层字符串的深层副本不能通过自动存储进行。在嵌入式系统上,您可以使用std::basic_string和自定义分配器 - 而不是std::string。 -
string_view有一个构造函数,它接受一个指针和一个大小。 -
这是否明确表示不要为列表中的三种情况中的每一种情况重载您的函数?否则,这似乎是显而易见的解决方案。
标签: c++ c++17 null-terminated string-view