我偶然发现了这个http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html,我试图了解它应该是什么。
我无法看到ArrayRef
解决了什么问题,有人可以解释一下这背后的动机吗?
答案 0 :(得分:4)
std::string_view
背后有同样的想法:为某些事物提供一般视图,而不管理它的生命周期。
在ArrayRef
(这是一个可怕的名字,ArrayView是更好的IMHO)的情况下,它可以查看其他数组类型,包括非对象内置数组(C数组)。例如,您的函数可能如下所示:
size_t sum (ArrayRef<size_t> view){
return std::accumulate(view.begin(),view.end(),0);
}
并用C-Array调用它:
size_t arr[] = {1,2,3,4,5,6,7};
auto _sum = sum(arr);
如果您将参数类型更改为,例如std::vector
,则ArrayRef
仍然有效。
你能不只是模板化一个参数并让它接受任何参数 任何长度的不同类型的数组?
关键是你不必指向第一个元素,你可以指向数组中的2,3或任何元素,所以基本上你建议的函数看起来像
template<class Array>
void doSomthing(Array& array , size_t pos, size_t length){/*...*/}
在这种情况下,你在课堂上表现得更好(就像你和std::string_view
而不是const char*
+ size_t
更好。)