如何返回一个std::string的常量视图?

3

在使用C++进行原型设计和实验,尝试一些概念来创建一个支持utf8的不可变字符串时,我遇到了以下困境:

是否有办法返回一个不可变字符串的视图。例如,我想返回一个子字符串的视图,而不是返回一个新的子字符串。

// Just some quick prototyping of ideas.
// Heavier than just a normal string.
// Construction would be heavier too because of the indices vector.
// Size would end up being O1 though.
// Indexing would also be faster.

struct ustring {
    std::string data;
    std::vector<size_t> indices;

    // How do I return a view to a string?

    std::string operator [](size_t const i) const {
        return data.substr(indices[i], indices[i + 1] - indices[i]);
    }
};

3
你是否可以使用C++17中的string_view类? - Paul Rooney
3
有些库在C++14中实现了<experimental/string_view>,在此之前,Boost库已经有了string_view库。您也可以使用GSL。 - jaggedSpire
1个回答

5

看起来std::string_view是适合你的类!如果你没有C++17支持,那么可以尝试使用std::experimental::string_view。如果不可用,则可以尝试使用boost::string_view。所有这些选择都可以以相同的方式使用(只需将std::string_view替换为你使用的内容):

std::string_view operator [](size_t const i) const {
    return std::string_view(&data[i], 1);
}

欢迎来到C++,这里总是有另一个厨房水槽!


在Visual Studio 2017中,头文件确实出现在智能感知中,但是当我输入std::时,没有string_viewexperimental::string_view可用。也许他们只是为将来保留了这个词? - João Pires
你是否包含了 #include <string_view> 或者 #include <experimental/string_view> - Travis Gockel
#include <string_view> - João Pires
编译失败是在 #include 还是在尝试使用 std::string_view 时?(我有点摸不着头脑——我并不真正使用 Visual Studio 或 MSVC) - Travis Gockel
1
让我们在聊天中继续讨论 - Travis Gockel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接