C++ 是否可以从C+中的视图构造“std::span”+;20?
此示例程序未编译,因为无法将C++ 是否可以从C+中的视图构造“std::span”+;20?,c++,c++20,std-ranges,std-span,C++,C++20,Std Ranges,Std Span,此示例程序未编译,因为无法将transform\u视图转换为std::span: class-Foo{ 私人: 向量字符串={a”,“b”,“c”}; 公众: std::span getStrings(){ 返回字符串| std::views::transform([](const std::string&str){return str.c_str();}); } }; int main(){ 富富,; auto strings=foo.getStrings(); 用于(自动s:字符串) 标准:
transform\u视图
转换为std::span
:
class-Foo{
私人:
向量字符串={a”,“b”,“c”};
公众:
std::span getStrings(){
返回字符串| std::views::transform([](const std::string&str){return str.c_str();});
}
};
int main(){
富富,;
auto strings=foo.getStrings();
用于(自动s:字符串)
标准::cout
是否可以从C++20中的视图构造std::span
可以从任何连续范围(适当的基础类型)构造跨度。这里的问题是:
std::span getStrings(){
返回字符串| std::views::transform([](const std::string&str){return str.c_str();});
}
您正在生成的自适应范围不是连续的,它只是随机访问。span
必须引用在内存中连续的char const*
s,这里肯定不是这种情况。这就是为什么这不起作用
但这并不意味着任何调整范围都不能转换为span
。例如,这将起作用:
std::span getStrings(){
返回字符串| std::views::take(5);
}
因为views::take
可以保持连续性(以transform
无法实现的方式,原因很清楚)
是否可以从C++20中的视图构造std::span
可以从任何连续范围(适当的基础类型)构造跨度。这里的问题是:
std::span getStrings(){
返回字符串| std::views::transform([](const std::string&str){return str.c_str();});
}
您正在生成的自适应范围不是连续的,它只是随机访问。span
必须引用在内存中连续的char const*
s,这里肯定不是这种情况。这就是为什么这不起作用
但这并不意味着任何调整范围都不能转换为span
。例如,这将起作用:
std::span getStrings(){
返回字符串| std::views::take(5);
}
因为views::take
可以保持连续性(以transform
无法的方式,原因很清楚)。std::span
是一个指针和大小。它指向数组(或不指向任何地方)。没有const char*
数组
您也无法从std::deque
获取std::span
。std::span
是指针和大小。它指向数组(或不指向任何地方)。没有常量字符*
数组
您也不能从std::deque
中获取std::span
。Nostd::span
不能从任意范围构造。它只是一个在连续范围上的简单轻型查看器。Nostd::span
不能从任意范围构造。它只是一个在连续范围上的简单轻型查看器范围。谢谢,这很有意义。但是我问题的第二部分如何?我想能够将视图传递回调用方,但是我的方法实际上是接口的一部分,因此它是虚拟的,我不能执行类似于constepr auto getStrings()的操作
。在这种情况下,我必须创建并返回数组或向量吗?@Carsten在您的情况下,您可以返回span
,而无需进行转换(这比span
更好)。否则,vector
可能是一个不错的选择。谢谢,我认为span
在大多数情况下都可以。不过,我需要为一些C API获取const char*
数组。不过,我认为在这种情况下,我将使用一些转换帮助程序来简化存储指针的vector
。谢谢!谢谢,这使我的问题的第二部分怎么样?我希望能够将视图传递回调用者,但是我的方法实际上是接口的一部分,因此它是虚拟的
,我不能执行类似constepr auto getStrings()的操作
。在这种情况下,我必须创建并返回数组或向量吗?@Carsten在您的情况下,您可以返回span
,而无需进行转换(这比span
更好)。否则,vector
可能是一个不错的选择。谢谢,我认为span
在大多数情况下都可以。不过,我需要为一些C API获取const char*
数组。不过,我认为在这种情况下,我将使用一些转换帮助程序来简化存储指针的vector
。谢谢!