微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从一系列字符构造一个string_view

如何解决从一系列字符构造一个string_view

虽然span可以从一个范围构造,但是string_view不能从一个字符范围构造。

因此,例如,以下代码是必需的:

// assume chars_span is a span of chars
std::cout << std::string_view(chars_span.data(),chars_span.size());
// or:
std::cout << std::string_view(chars_span.begin(),chars_span.end());

代替了不受支持的更简单的范围语法

std::cout << std::string_view(chars_span);

是否有理由没有为string_view提供一个接受一定范围字符的构造函数,还是只是被忽略或认为不够重要?

解决方法

P1391r3提出了这个建议,尽管最终在C ++ 20最终采用的版本中删除了该建议:P1391r4。不幸的是,纸张上完全没有该纸张掉落的原因(实际上,该纸张甚至没有提到它已被丢弃)。

但是,后续论文P1989R0提出了这样的问题:如果我们使用这样的类型(我稍微修改了示例),会发生什么:

struct buffer {
    buffer() {};
    char const* begin() const { return data; }
    char const* end() const { return data + 42; }
    operator string_view() const {
        return string_view(data,data + 2);
    }
private:
    char data[42];
};

此处,buffer可转换为string_view。但是将其转换为string_view的方式与string_view的范围构造器执行此操作的方式不同(前者给您两个字符,后者给您42个字符)。据我所知,实际上没有人指出这种类型的存在。

尽管如此,方向是确保这些类型继续有效,因此新论文针对该特定构造函数具有一组更为复杂的约束。


一个更有趣的例子是:

using ci_string = std::basic_string<char,case_insensitive_traits>;

ci_string value = "Hello";
std::string_view sv = value;

任何一种简单的基于范围的推理都将允许从ci_stringstd::string的转换。 ci_stringchar的一个很好的连续范围,没有像以前的buffer类型那样的怪异转换问题。但是,尽管ci_string应该可以转换为basic_string_view<char,case_insensitive_traits>,但我们可能不想避免将其转换为普通的string_view。这不太可能实现,因此我们需要对此加以防范。

buffer案例相比,此案例对我而言更具激励作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?