【发布时间】:2015-10-28 14:13:54
【问题描述】:
假设我在一个类中有一个成员变量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。所以我的问题是:有没有办法在不显式添加std::vector<gsl::cstring_view<>> 类型的成员的情况下使用这样的构造,这显然是不可取的?
编辑
在我看来,这种“转变”的观点可能更普遍。考虑拥有一个拥有指针的vector,例如std::vector<std::shared_ptr<T>>,我想将其作为原始指针的array_view 暴露给类的用户:gsl::array_view<const T*>,而不暴露我的实现定义的存储方法。想法?
【问题讨论】:
-
有了
cstring_views 的这个理论上的array_view,谁将拥有cstring_views 的集合,cstring_views 的array_view的存在需要它的存在? -
@jaggedSpire 嗯,这正是我在问题的最后一段中所说的。但也许有某种惰性求值
array_view的方法,可以根据要求将任何string_view兼容数组值转换为string_view。我可能会写这样的东西,但我认为也许有更好的方法。因此这个问题:) -
啊。如果您想引用可以轻量级转换为
cstring_views 的非拥有集合,请问为什么要避免array_view的std::strings? -
@jaggedSpire 是的,这实际上就是我现在在代码中的内容。但是,如果其他子类将其字符串存储为
std::vector<const char*>怎么办?这是一种“学术”兴趣,如果其他人认为它有用(谁知道?),可能会对 gsl 做出一些贡献。 -
我(以我有限的经验:P)能想到的那些方法的唯一替代方法是构建一个
cstring_views 的向量并将其传递出要转换为的函数客户代码认为合适。如果客户端在一个表达式中需要它,它可以作为临时返回,客户端可以构造一个array_view内联。否则,他们可以只保留向量并根据需要从中构造array_views。当然,您需要在每次需要时都构造它,因此只有在需要将array_view<cstring_view>传递给函数时才有意义
标签: c++ c++14 array-view string-view cpp-core-guidelines