gpt4 book ai didi

c++ - gsl::array_view> 来自 std::vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:06 27 4
gpt4 key购买 nike

假设我有一个成员变量std::vector<std::string>在一个类中,我想使用 gsl::array_view 的组合从成员函数返回它作为不可变 View 和 gsl::cstring_view .不幸的是,以下内容无法编译:

class C {
public:
gsl::array_view<const gsl::cstring_view<>> getVectorOfStrings() const
{
return _vectorOfStrings;
}

private:
std::vector<std::string> _vectorOfStrings;
};

这是因为没有 cstring_view 的容器那array_view可以创建自。所以我的问题是:有没有一种方法可以在不显式添加类似 std::vector<gsl::cstring_view<>> 类型的成员的情况下使用这种构造? ,这显然是不可取的?

编辑

在我看来,这种“转换”观点可能具有更普遍的用途。考虑拥有一个 vector拥有指针,例如 std::vector<std::shared_ptr<T>> ,我想将其作为 array_view 公开给该类的用户原始指针:gsl::array_view<const T*>在不公开我的实现定义的存储方法的情况下。想法?

最佳答案

根据定义, View 通常只提供对现有对象的引用。因此,无法创建正常的 array_view<const cstring_view<>>。无需先创建匹配的容器,例如一个vector<const cstring_view<>> .

然而,您可以为 gsl::array_view<const cstring_view<>> 创建自己的特化,创建一个 cstring_view<>按需(调用索引运算符时以及取消引用迭代器时)。虽然与原始方法相比,这会为您节省动态内存分配并减少内存占用,但我认为在大多数情况下不值得增加复杂性。

如果您想遵循编辑中描述的通用方法,您可能需要查看 boost::transform_iterator - 直接使用或作为您自己的通用灵感 transform_array_view类(我敢肯定,这将是对 gsl 或 boost 的一个受欢迎的补充)。

关于c++ - gsl::array_view<const gsl::cstring_view<>> 来自 std::vector<std::string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33393412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com