ArrayRef

时间:2016-12-27 09:01:39

标签: c++ arrays llvm pass-by-reference

我偶然发现了这个http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html,我试图了解它应该是什么。

我无法看到ArrayRef解决了什么问题,有人可以解释一下这背后的动机吗?

1 个答案:

答案 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更好。)