QAnyStringView类

QAnyStringView类提供对Latin-1、UTF-8或UTF-16字符串的统一视图,并包含QString API的可读子集。《a href="qstring.html" translate="no">QString。 更多...

头文件 #include <QAnyStringView>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
Qt 6.0

注意:本类中所有函数都是可重入的

公共类型

公共函数

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)
QCharback() const
(since 6.5) voidchop(qsizetype n)
(since 6.5) QAnyStringViewchopped(qsizetype n) const
const void *data() const
boolempty() const
(since 6.5) QAnyStringViewfirst(qsizetype n) const
QCharfront() const
boolisEmpty() const
boolisNull() const
(since 6.5) QAnyStringViewlast(qsizetype n) const
qsizetypelength() const
qsizetypesize() const
qsizetypesize_bytes() const
(since 6.5) QAnyStringViewsliced(qsizetype pos) const
(since 6.5) QAnyStringViewsliced(qsizetype pos, qsizetype n) const
QStringtoString() const
(since 6.5) voidtruncate(qsizetype n)
decltype(auto)visit(Visitor &&v) const

静态公共成员

intcompare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive)
booloperator!=(QAnyStringView lhs, QAnyStringView rhs)
booloperator<(QAnyStringView lhs, QAnyStringView rhs)
(自6.7起) QDebugoperator<<(QDebug d, QAnyStringView s)
booloperator<=(QAnyStringView lhs, QAnyStringView rhs)
booloperator==(QAnyStringView lhs, QAnyStringView rhs)
booloperator>(QAnyStringView lhs, QAnyStringView rhs)
booloperator>=(QAnyStringView lhs, QAnyStringView rhs)

详细描述

QAnyStringView引用了一个字符串的连续部分,它不拥有该字符串。它是各种字符串的接口类型,无需先构造QString

QStringViewQUtf8StringView不同,QAnyStringView可以存储任何以下编码的字符串:UTF-8、UTF-16和Latin-1。后者被支持,因为与UTF-8不同,Latin-1可以有效地与UTF-16数据进行比较:长度不匹配已经意味着字符串不相等。这对于UTF-8/UTF-16比较不是真的,因为UTF-8是可变长度的编码。

字符串可以表示为一个charchar8_tQCharushortchar16_t或(在Windows等平台上是16位类型的情况下)wchar_t的数组(或与数组兼容的数据结构,如QString、std::basic_string等)。

QAnyStringView被设计为一个接口类型;它的主要用例是作为函数参数类型。当作为自动变量或数据成员使用QAnyStringView时,必须小心确保引用的字符串数据(例如,由QString拥有)在所有代码路径上都比QAnyStringView生存期长,以免字符串视图最终引用被删除的数据。

当作为接口类型使用时,QAnyStringView允许一个函数接受广泛的各种字符串数据源。接受QAnyStringView的函数因此取代了五个函数重载(接受QString(const QChar*, qsizetype)QUtf8StringViewQLatin1StringView(但请参阅上面),以及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 也可以用作函数的返回值,但这种方法不推荐使用。更合适的选择是使用 QUtf8StringViewQStringView 作为函数返回值。如果调用返回 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 多字节序列根据其长度计算为两个、三个或四个)。

另请参阅 QUtf8StringViewQStringView

成员类型文档

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 为负,或者当正时如果 strnullptr,则行为未定义。

只有当 Char 是兼容字符类型时,此构造函数才参与重载解析。

另请参阅 isNull() 和 兼容字符类型

[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传递是安全的,并导致空字符串视图。

如果lastfirst之前,或firstnullptrlast不是,则行为是未定义的。

只有当 Char 是兼容字符类型时,此构造函数才参与重载解析。

另请参阅 isNull() 和 兼容字符类型

[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是兼容字符类型时,此构造函数才参与重载解析。

另请参阅 isNull() 和 兼容字符类型

[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))是不确定的。

另请参阅 isNull() 和 isEmpty()。

[constexpr] QChar QAnyStringView::back() const

返回字符串视图中的最后一个字符。

此函数提供用于 STL 兼容性。

警告: 在空字符串视图中调用此函数会构成未定义行为。

另请参阅 front() 和 大小和子串

[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,为零。

如果 csQt::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 兼容性。

警告: 在空字符串视图中调用此函数会构成未定义行为。

另请参阅 back() 和 大小和子字符串

[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 兼容性。

另请参阅 size() 和 data()。

[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,可能是一个 QUtf8StringViewQLatin1StringQStringView

大多数接受 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)

比较 lhsrhs 的运算符。

另请参阅 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 公司商标。所有其他商标均为其各自所有者的财产。