为什么我不能从迭代器构造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

调用this constructor(3)
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上编译良好。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...