2

假设我std::vector<std::string>在一个类中有一个成员变量,并且我想使用gsl::array_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所以我的问题是:有没有一种方法可以在不显式添加类似 type 的成员的情况下使用这样的构造std::vector<gsl::cstring_view<>>,这显然是不可取的?

编辑

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

4

1 回答 1

1

根据定义,视图通常只提供对现有对象的引用。因此,如果array_view<const cstring_view<>>不首先创建一个匹配的容器,例如 a ,就无法创建一个法线vector<const cstring_view<>>

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

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

于 2015-11-09T22:56:19.893 回答