Cur*_*ous 5 c++ arrays llvm pass-by-reference
我偶然发现了这个http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html,我试图了解它的用途。
我看不到ArrayRef解决了什么问题,有人可以解释一下背后的动机吗?
背后的想法是相同的std::string_view:在不管理生命周期的情况下提供某些事物的一般视图。
在ArrayRef(这是一个糟糕的名称,ArrayView更好的恕我直言)的情况下,它可以查看其他数组类型,包括非对象内置数组(C数组)。因此,例如,您的函数可能如下所示:
size_t sum (ArrayRef<size_t> view){
return std::accumulate(view.begin(),view.end(),0);
}
Run Code Online (Sandbox Code Playgroud)
并使用C-Array调用它:
size_t arr[] = {1,2,3,4,5,6,7};
auto _sum = sum(arr);
Run Code Online (Sandbox Code Playgroud)
如果更改参数类型,例如std::vector,ArrayRef仍然有效。
您不仅可以模板化参数并接受任意长度的任何其他类型的数组吗?
关键是您不必指向第一个元素,可以指向数组2,3或任何元素,因此基本上建议的函数看起来像
template<class Array>
void doSomthing(Array& array , size_t pos, size_t length){/*...*/}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,使用类要好得多(就像使用+ std::string_view而不是更好)。const char*size_t