问题标签 [std-span]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将 nullptr 转换为 std::span
我有一个const z* zs = nullptr;
我想转换zs
为std::span
当我尝试这样做时,std::span<const z>(zs)
我收到一条错误消息
错误:没有匹配函数调用 'std::span::span(const z* const&)'</p>
如何将 zs 转换为std::span
我试过std::span<const z>(zs[0])
它似乎可以编译。这种方式正确吗?
c++ - 具有未知类型的 std::conditional
我目前正在编写一个使用 C++20 的库std::span
。编译器库支持std::span
在这一点上相当稀缺。因此,我有一个允许使用第 3 方实现的 marco(在我的情况下tcb::span
)。宏如下所示:
通过库的用法如下所示:
这一点都不漂亮。我一直在寻找更好的解决方案,但我遇到了std::conditional
我过去已经使用过的解决方案。一个天真的尝试看起来像这样:
这将导致这样的用法:
问题在于std::span
编译时未知类型std::span
不可用,导致编译失败。
有更好的解决方案吗?
c++ - 从 C 字符串数组创建 string_views 的范围
给定一些函数void func(std::span<std::string_view>)
,如何const char**
以最有效的方式为该函数提供原始 C 字符串数组?
据我了解,这应该是可能的,因为std::string_view
可以从 C 字符串std::span
构造并且可以从指针 + 大小构造,而无需任何复制。但是,我似乎无法弄清楚正确的语法。
std::vector<std::string_view>
下面是一些通过迭代字符串数组中的每个字符串来创建一个的最小代码:
这是完成繁重工作的 coliru 链接:https ://coliru.stacked-crooked.com/a/cb8fb8ebbc962d45
c++ - 为什么我不能从迭代器构造一个 std::span ?
考虑一个大型内存容器。在这个简单的例子中std::vector<int>
:
std::span
允许我创建一个轻量级的内存视图。现在我想简单地打印跨度:
输出:
现在我想制作子集(这std::span
实际上是作为视图有用的地方)。我可以使用迭代器来指定我的范围并从std::span
但这不起作用:
C++ 没有构造函数实例匹配参数列表参数类型是: (std::_Vector_iterator<std::_Vector_val<std::conditional_t<true, std::_Simple_types, std::_Vec_iter_types<int, size_t, ptrdiff_t, int *, const int *, int &, const int &>>>>, std::_Vector_iterator<std::_Vector_val<std::conditional_t<true, std::_Simple_types, std::_Vec_iter_types<int, size_t, ptrdiff_t, int * , const int *, int &, const int &>>>>)
有可能使用带有指针和大小的构造函数(2):
但这违背了迭代器的目的。
如何构造std::span
using 迭代器?我错过了什么吗?
完整代码:
在 MSVC 实现构造函数之前,我将使用这个make_span
函数:
使用 Visual Studio Community 2019 版本 16.7.5。配置:x64,发布。C++ 语言标准 = /std:c++latest
c++ - 为什么我应该将 std::span 而不是 std::vector& 传递给函数?
我知道这可能与什么是“跨度”以及何时应该使用“跨度”这个问题重叠?,但我认为问题的这个特定部分的答案非常令人困惑。一方面,有这样的引用:
如果您有一个您知道适合您的代码的标准库容器(或 Boost 容器等),请不要使用它。它并不打算取代其中任何一个。
但在同一个答案中,出现了以下语句:
当您希望数据在内存中连续时,将 const vector& 传递给函数是合理的替代方法。再也不用被高大上的 C++ 大师骂了!
那么我没有到达这里的哪一部分?我什么时候会这样做:
什么时候?
还有,这会
有什么意义吗?我认为它不应该,因为 astd::span
只是 a struct
,包含一个指针和长度。但是,如果它不阻止您更改std::vector
作为参数传递的值,它如何替换 a const std::vector<T>&
?
c++ - 使用 std::span 的通用函数无法编译
我想制作一个isIn
需要std::span
.
这是我的尝试:
正如你所看到的,我可以通过做这个演员来解决:
但这很冗长,我想做这样的事情:
有什么方法可以实现吗?
c++ - 如何使用用户定义的概念作为 std::span 的模板类型?
我想将我的用户定义概念用作 std::span 的模板类型,但模板参数推导无法按预期工作。当我尝试将“ std::array
of char
”传递给模板函数时;编译器显示错误“ error: no matching function for call to 'print' ”并在我将鼠标悬停在模板定义上时警告我“注意:候选模板被忽略:无法匹配 'span' 与 'array'”。
这是概念定义和功能模板:
并且无法按预期工作的用户代码:
有效且不产生错误的用户代码:
有没有办法在不专门指定数组类型的情况下调用这个模板函数。我应该如何更改模板函数定义以使函数以我提到的方式调用 ( print(arr)
) ?
编辑:我希望能够使用 std::span 的好处,并能够使用 std::array、std::vector 和纯 C 样式数组调用模板函数。
c++ - 如何制作跨度的跨度
C++20std::span
是一个非常好的编程接口。但似乎没有一个简单的方法来拥有跨度。这是我想做的事情:
这不编译。我该怎么做这样的事情?
c++ - 是否可以从 C++20 中的视图构造一个`std::span`?
此示例程序无法编译,因为transform_view
无法转换为std::span
:
我知道还不能构造容器(如std::vector
),但是我不太明白,为什么不能从中构造 a std::span
。我找到了这个答案,也就是说,目前唯一可以从任意范围构造的容器是std::span
,所以我希望上面的示例能够工作。
有没有办法从一个范围创建一个跨度?或者有没有其他方法可以从方法返回通用视图,而不使用auto
(虚拟方法不允许这样做)?