如何解决为什么我不能从迭代器构造std :: span?
考虑一个大的存储容器。在这个简单的示例中,std::vector<int>
:
std::vector v = { 0,1,2,3,4,5 };
std::span
使我可以在内存上创建轻量级视图。现在,我想简单地打印跨度:
template<typename T>
void print(std::span<T> span) {
std::cout << '[';
if (span.size())
std::copy(span.begin(),span.end() - 1,std::ostream_iterator<int>(std::cout,","));
std::cout << span.back() << "]\n";
}
int main() {
std::vector v = { 0,5 };
print(std::span{ v });
}
输出:
[0,5]
现在,我想制作子集(std::span
实际上成为视图的地方)。我可以使用迭代器来指定我的范围,并从std::span
template< class It,class End >
explicit(extent != std::dynamic_extent)
constexpr span( It first,End last );
但这不起作用:
print(std::span{ v.begin() + 2,v.end() }); //error E0289
C ++没有构造函数的实例与参数列表匹配的参数类型为:(std :: _ Vector_iterator
>>>,std :: _ Vector_iterator >>>)
有可能使用带有指针和大小的构造函数(2):
print(std::span{ v.data() + 1,3 }); //-> prints [1,3]
但这违反了迭代器的目的。
如何使用迭代器构造std::span
?我想念什么吗?
完整代码:
#include <iostream>
#include <vector>
#include <span>
#include <algorithm>
template<typename T>
void print(std::span<T> span) {
std::cout << '[';
if (span.size())
std::copy(span.begin(),5 };
print(std::span{ v.begin() + 2,v.end() });
}
直到MSVC实现了构造函数,我将使用此make_span
函数:
template<typename It>
constexpr auto make_span(It begin,It end) {
return std::span<std::remove_pointer_t<It::pointer>>(&(*begin),std::distance(begin,end));
}
使用Visual Studio Community 2019版本16.7.5。配置:x64,发布。 C ++语言标准= / std:c ++ latest
解决方法
您可以使用迭代器构造contentpage
,它具有such a constructor(由P1394添加,您可以在[views.span]中看到):
val sub1 =findViewById<Button>(R.id.sub1)
sub1.setOnClickListener {
val pw1: String = pw1.text. toString()
if (pw1.equals( "1234"))
phone1.visibility = View.VISIBLE
else phone1.visibility = View.INVISIBLE }
只是MSVC的标准库没有实现它。该程序可以按预期在gcc上编译良好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。