QAnyStringView类
QAnyStringView类提供对Latin-1、UTF-8或UTF-16字符串的统一视图,并包含QString API的可读子集。《a href="qstring.html" translate="no">QString。 更多...
头文件 | #include <QAnyStringView> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
自 | Qt 6.0 |
- 所有成员列表,包括继承的成员
- 已弃用成员
- QAnyStringView是字符串数据处理类的一部分。
注意:本类中所有函数都是可重入的。
公共类型
公共函数
QAnyStringView() | |
QAnyStringView(std::nullptr_t) | |
QAnyStringView(const Char *str, qsizetype len) | |
QAnyStringView(const Char *first, const Char *last) | |
QAnyStringView(const Char (&)[N] string) | |
QAnyStringView(const Char *str) | |
QAnyStringView(const QByteArray &str) | |
QAnyStringView(const QString &str) | |
QAnyStringView(const Container &str) | |
QChar | back() const |
(since 6.5) void | chop(qsizetype n) |
(since 6.5) QAnyStringView | chopped(qsizetype n) const |
const void * | data() const |
bool | empty() const |
(since 6.5) QAnyStringView | first(qsizetype n) const |
QChar | front() const |
bool | isEmpty() const |
bool | isNull() const |
(since 6.5) QAnyStringView | last(qsizetype n) const |
qsizetype | length() const |
qsizetype | size() const |
qsizetype | size_bytes() const |
(since 6.5) QAnyStringView | sliced(qsizetype pos) const |
(since 6.5) QAnyStringView | sliced(qsizetype pos, qsizetype n) const |
QString | toString() const |
(since 6.5) void | truncate(qsizetype n) |
decltype(auto) | visit(Visitor &&v) const |
静态公共成员
int | compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) |
相关非成员
bool | operator!=(QAnyStringView lhs, QAnyStringView rhs) |
bool | operator<(QAnyStringView lhs, QAnyStringView rhs) |
(自6.7起) QDebug | operator<<(QDebug d, QAnyStringView s) |
bool | operator<=(QAnyStringView lhs, QAnyStringView rhs) |
bool | operator==(QAnyStringView lhs, QAnyStringView rhs) |
bool | operator>(QAnyStringView lhs, QAnyStringView rhs) |
bool | operator>=(QAnyStringView lhs, QAnyStringView rhs) |
详细描述
QAnyStringView引用了一个字符串的连续部分,它不拥有该字符串。它是各种字符串的接口类型,无需先构造QString。
与QStringView和QUtf8StringView不同,QAnyStringView可以存储任何以下编码的字符串:UTF-8、UTF-16和Latin-1。后者被支持,因为与UTF-8不同,Latin-1可以有效地与UTF-16数据进行比较:长度不匹配已经意味着字符串不相等。这对于UTF-8/UTF-16比较不是真的,因为UTF-8是可变长度的编码。
字符串可以表示为一个char
、char8_t
、QChar、ushort
、char16_t
或(在Windows等平台上是16位类型的情况下)wchar_t
的数组(或与数组兼容的数据结构,如QString、std::basic_string等)。
QAnyStringView被设计为一个接口类型;它的主要用例是作为函数参数类型。当作为自动变量或数据成员使用QAnyStringView时,必须小心确保引用的字符串数据(例如,由QString拥有)在所有代码路径上都比QAnyStringView生存期长,以免字符串视图最终引用被删除的数据。
当作为接口类型使用时,QAnyStringView允许一个函数接受广泛的各种字符串数据源。接受QAnyStringView的函数因此取代了五个函数重载(接受QString、(const QChar*, qsizetype)
、QUtf8StringView、QLatin1StringView(但请参阅上面),以及QChar),同时还能使更多类型的字符串数据源传递给函数,例如u8"Hello World"
、一个char8_t
字符串字面量。
与Qt的其他地方一样,QAnyStringView假定char
数据以UTF-8编码,除非它以QLatin1StringView的形式显示。
然而,从Qt 6.4开始,纯US-ASCII的UTF-8字符串字面量自动存储为Latin-1。这是一个编译时检查,没有运行时开销。此功能需要在C++20中编译,或者使用最近的GCC。
QAnyStringView应按值传递,而不是通过const引用传递
void myfun1(QAnyStringView sv); // preferred void myfun2(const QAnyStringView &sv); // compiles and works, but slower
QAnyStringView 也可以用作函数的返回值,但这种方法不推荐使用。更合适的选择是使用 QUtf8StringView 或 QStringView 作为函数返回值。如果调用返回 QAnyStringView 的函数,请特别注意不要将 QAnyStringView 保持得比函数承诺保持所引用的字符串数据存活得更长。如有疑问,可以通过调用 toString() 将 QAnyStringView 转换为 QString 来获取数据的强引用。
QAnyStringView 是一种 字面量类型。
兼容字符类型
QAnyStringView 接受各种字符类型的字符串。
char
(有符号和无符号均可用)char8_t
(仅支持 C++20)char16_t
wchar_t
(当它是16位类型时,例如 Windows)ushort
QChar
8位字符类型被解释为 UTF-8 数据(除了以 QLatin1StringView 形式出现时),而16位字符类型则以主机字节序解释为 UTF-16 数据(与 QString 相同)。
大小和子字符串
在 QAnyStringView 函数中,所有大小和位置都在编码的代码单元中(也就是说,UTF-16 代理对在这些函数中被计算为两个,与 QString 相同,而 UTF-8 多字节序列根据其长度计算为两个、三个或四个)。
另请参阅 QUtf8StringView 和 QStringView。
成员类型文档
QAnyStringView::difference_type
是 std::ptrdiff_t
的别称。为与 STL 兼容而提供。
QAnyStringView::size_type
是 qsizetype 的别称。为与 STL 兼容而提供。
成员函数文档
[constexpr noexcept]
QAnyStringView::QAnyStringView()
构建一个空字符串视图。
另请参阅 isNull()。
[constexpr noexcept]
QAnyStringView::QAnyStringView(std::nullptr_t)
构建一个空字符串视图。
另请参阅 isNull()。
[constexpr]
template <typename Char, QAnyStringView::if_compatible_char<Char> = true> QAnyStringView::QAnyStringView(const Char *str, qsizetype len)
使用 str 构造字符串视图,长度为 len。
这个范围 [str,len)
必须在字符串视图对象的生命期内保持有效。
如果 len 也为 0,则将 nullptr
作为 str 传递是安全的,并将生成一个空字符串视图。
如果 len 为负,或者当正时如果 str 是 nullptr
,则行为未定义。
只有当 Char 是兼容字符类型时,此构造函数才参与重载解析。
[constexpr]
模板 <typename Char, QAnyStringView::if_compatible_char<Char> = true> QAnyStringView::QAnyStringView(const Char *first, const Char *last)
在first上构造一个字符串视图,长度为(last - first)。
[first,last)范围必须在此字符串视图对象生命周期内保持有效。
如果last也是nullptr
,则将nullptr
作为first传递是安全的,并导致空字符串视图。
如果last在first之前,或first是nullptr
而last不是,则行为是未定义的。
只有当 Char 是兼容字符类型时,此构造函数才参与重载解析。
[constexpr noexcept]
模板 <typename Char, size_t N> QAnyStringView::QAnyStringView(const Char (&)[N] string)
在字符字符串文字string上构造字符串视图。视图覆盖数组直到遇到第一个Char(0)
或N
,取其较小者。如果您需要整个数组,请使用fromArray()代替。
string必须在此字符串视图对象的生命周期内保持有效。
只有当string是实际数组并且Char
是兼容字符类型时,此构造函数才参与重载解析。
另请参阅兼容字符类型。
[constexpr noexcept]
模板 <typename Char> QAnyStringView::QAnyStringView(const Char *str)
在str上构造字符串视图。长度通过查找第一个Char(0)
来确定。
str必须在此字符串视图对象的生命周期内保持有效。
将nullptr
作为str传递是安全的,并导致空字符串视图。
只有当str不是数组并且Char
是兼容字符类型时,此构造函数才参与重载解析。
[noexcept]
QAnyStringView::QAnyStringView(const QByteArray &str)
在str上构造字符串视图。将str中的数据解释为UTF-8。
str.data()
必须在此字符串视图对象的生命周期内保持有效。
如果str.isNull()
,则字符串视图将为空。
[noexcept]
QAnyStringView::QAnyStringView(const QString &str)
在str上构造字符串视图。
str.data()
必须在此字符串视图对象的生命周期内保持有效。
如果str.isNull()
,则字符串视图将为空。
[constexpr noexcept]
模板 <typename Container, QAnyStringView::if_compatible_container<Container> = true> QAnyStringView::QAnyStringView(const Container &str)
在str上构造字符串视图。长度采用std::size(str)
。
std::data(str)
必须在此字符串视图对象的生命周期内保持有效。
只有当Container
是一个具有与value_type
兼容字符类型的容器时,此构造函数才参与重载解析。
如果并将仅当 std::size(str) == 0
,字符串视图将为空。是否此构造函数会导致空字符串视图(必须返回 nullptr
,则 std::data(str)
)是不确定的。
[constexpr]
QChar QAnyStringView::back() const
返回字符串视图中的最后一个字符。
此函数提供用于 STL 兼容性。
警告: 在空字符串视图中调用此函数会构成未定义行为。
[constexpr, since 6.5]
void QAnyStringView::chop(qsizetype n)
通过 n 代码点截断此字符串视图。
等同于 *this = first(size() - n)
。
注意: 当 n < 0 或 n > size() 时,行为是未定义的。
此函数自 Qt 6.5 起引入。
另请参阅 sliced(),first(),last(),chopped(),truncate() 和 大小和子串。
[constexpr, since 6.5]
QAnyStringView QAnyStringView::chopped(qsizetype n) const
返回从该对象开始长度的子串 size() - n。
等同于 first(size() - n)
。
注意: 当 n < 0 或 n > size() 时,行为是未定义的。
此函数自 Qt 6.5 起引入。
另请参阅 sliced(),first(),last(),chop(),truncate() 和 大小和子串。
[static noexcept]
int QAnyStringView::compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive)
比较字符串视图 lhs 与字符串视图 rhs 并返回一个负整数,如果 lhs 小于 rhs,则是一个正整数,如果它大于 rhs,为零。
如果 cs 是 Qt::CaseSensitive(默认),则比较区分大小写;否则比较不区分大小写。
另请参阅 operator==(),operator<() 和 operator>。
[constexpr noexcept]
const void *QAnyStringView::data() const
返回指向字符串视图第一个字符的 const 指针。
注意: 返回值的字符数组 不是 以 null 结尾的。
另请参阅 size_bytes。
[constexpr noexcept]
bool QAnyStringView::empty() const
返回此字符串视图是否为空 - 即,size() == 0
。
此函数提供用于 STL 兼容性。
另请参阅 isEmpty(),isNull() 和 size()。
[constexpr, since 6.5]
QAnyStringView QAnyStringView::first(qsizetype n) const
返回一个字符串视图,其中包含此字符串视图的前 n 个字符。
注意: 当 n < 0 或 n > size() 时,行为是未定义的。
此函数自 Qt 6.5 起引入。
另请参阅 last(),sliced(),chopped(),chop(),truncate(),以及 大小和子字符串。
[constexpr]
QChar QAnyStringView::front() const
返回字符串视图中的第一个字符。
此函数提供用于 STL 兼容性。
警告: 在空字符串视图中调用此函数会构成未定义行为。
[constexpr noexcept]
bool QAnyStringView::isEmpty() const
返回此字符串视图是否为空 - 即,size() == 0
。
此函数是为了与其他 Qt 容器兼容性提供。
另请参阅 empty(),isNull() 和 size()。
[constexpr noexcept]
bool QAnyStringView::isNull() const
返回此字符串视图是否为空 - 即,data() == nullptr
。
此函数是为与其他 Qt 容器兼容性提供。
另请参阅 empty(),isEmpty() 和 size()。
[constexpr, since 6.5]
QAnyStringView QAnyStringView::last(qsizetype n) const
返回一个字符串视图,其中包含此字符串视图的最后 n 个字符。
注意: 当 n < 0 或 n > size() 时,行为是未定义的。
此函数自 Qt 6.5 起引入。
另请参阅 first(),sliced(),chopped(),chop(),truncate(),以及 大小和子字符串。
[constexpr noexcept]
qsizetype QAnyStringView::length() const
与 size() 同义。
此函数是为了与其他 Qt 容器兼容性提供。
另请参阅 size()。
[constexpr noexcept]
qsizetype QAnyStringView::size() const
返回此字符串视图的大小,以编码的代码点为单位。
另请参阅 empty(),isEmpty(),isNull(),size_bytes(),以及 大小和子字符串。
[constexpr noexcept]
qsizetype QAnyStringView::size_bytes() const
返回此字符串视图的大小,但以字节为单位,而不是代码点。
您可以使用此功能与 data() 一起进行哈希或序列化。
此函数提供用于 STL 兼容性。
[constexpr, since 6.5]
QAnyStringView QAnyStringView::sliced(qsizetype pos) const
返回一个字符串视图,开始于此对象的 pos 位置,延伸到末尾。
注意: 当 pos < 0 或 pos > size() 时,行为是未定义的。
此函数自 Qt 6.5 起引入。
另请参阅 first(),last(),chopped(),chop(),truncate() 以及 大小及子字符串。
[constexpr, since 6.5]
QAnyStringView QAnyStringView::sliced(qsizetype pos, qsizetype n) const
返回一个字符串视图,包含从位置 pos 开始的 n 个代码点。
注意: 当 pos < 0,n < 0,或 pos + n > size() 时,行为是未定义的。
此函数自 Qt 6.5 起引入。
另请参阅 first(),last(),chopped(),chop(),truncate() 以及 大小及子字符串。
QString QAnyStringView::toString() const
返回此字符串视图数据的深拷贝,作为一个 QString。
如果此字符串视图为空,则返回值将是空的 QString。
[constexpr]
void QAnyStringView::truncate(qsizetype n)
将此字符串视图截断到 n 个代码点。
等同于 *this = first(n)
。
注意: 当 n < 0 或 n > size() 时,行为是未定义的。
此函数自 Qt 6.5 起引入。
另请参阅 sliced(),first(),last(),chopped(),chop() 以及 大小及子字符串。
[constexpr]
template <typename Visitor> decltype(auto) QAnyStringView::visit(Visitor &&v) const
根据此字符串视图引用的字符串数据的编码,调用 v,可能是一个 QUtf8StringView,QLatin1String 或 QStringView。
大多数接受 QAnyStringView 的函数就是通过这种方式分叉为针对特定编码的函数的
void processImpl(QLatin1String s) { ~~~ } void processImpl(QUtf8StringView s) { ~~~ } void processImpl(QStringView s) { ~~~ } void process(QAnyStringView s) { s.visit([](auto s) { processImpl(s); }); }
在这里,我们为 QAnyStringView 对象以及 lambda 参数重用了相同的名称,s
。这是惯用代码,有助于通过 visit() 调用跟踪对象的身份,例如,在更复杂的情况下
bool equal(QAnyStringView lhs, QAnyStringView rhs) { // assuming operator==(QAnyStringView, QAnyStringView) didn't, yet, exist: return lhs.visit([rhs](auto lhs) { rhs.visit([lhs](auto rhs) { return lhs == rhs; }); }); }
visit() 要求所有 lambda 实例具有相同的返回类型。如果它们不同,即使存在共同类型,也会在编译时产生错误。为了修复它,您可以在 lambda 上使用显式的返回类型,或在返回语句中进行转换
// wrong: QAnyStringView firstHalf(QAnyStringView input) { return input.visit([](auto input) { // ERROR: lambdas return different types return input.sliced(0, input.size() / 2); }); } // correct: QAnyStringView firstHalf(QAnyStringView input) { return input.visit([](auto input) -> QAnyStringView { // OK, explicit return type return input.sliced(0, input.size() / 2); }); } // also correct: QAnyStringView firstHalf(QAnyStringView input) { return input.visit([](auto input) { return QAnyStringView(input.sliced(0, input.size() / 2)); // OK, cast to common type }); }
相关非成员函数
[noexcept]
bool operator!=(QAnyStringView lhs, QAnyStringView rhs)
[noexcept]
bool operator<(QAnyStringView lhs, QAnyStringView rhs)
[noexcept]
bool operator<=(QAnyStringView lhs, QAnyStringView rhs)
[noexcept]
bool operator==(QAnyStringView lhs, QAnyStringView rhs)
[noexcept]
bool operator>(QAnyStringView lhs, QAnyStringView rhs)
[noexcept]
bool operator>=(QAnyStringView lhs, QAnyStringView rhs)
比较 lhs 和 rhs 的运算符。
另请参阅 compare().
[since 6.7]
QDebug operator<<(QDebug d, QAnyStringView s)
将 s 输出到调试流 d。
如果 d.quotedString()
是 true
,指示字符串使用的编码。如果您只想获取字符串数据,请使用 visit() 如此
s.visit([&d) (auto s) { d << s; });
此函数自 Qt 6.7 提出以来。
另请参阅 QAnyStringView::visit().
© 2024 Qt 公司。本文件中包含的文档贡献是各自所有者的版权。本文件中提供的文档是根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款许可的。Qt 及其相关标志是芬兰和/或其他国家的 Qt 公司商标。所有其他商标均为其各自所有者的财产。