Я наткнулся на это http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html, и я пытаюсь понять, для чего он предназначен.Назначение ArrayRef
Я не могу понять, какая проблема ArrayRef
решает, может кто-то объяснить причину этого?
Я наткнулся на это http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html, и я пытаюсь понять, для чего он предназначен.Назначение ArrayRef
Я не могу понять, какая проблема ArrayRef
решает, может кто-то объяснить причину этого?
Это та же идея, что и у std::string_view
: чтобы обеспечить общий вид чему-либо, не управляя его жизнью.
В случае ArrayRef
(это ужасное имя, ArrayView намного лучше IMHO), он может просматривать другие типы массивов, в том числе встроенный массив без объекта (массив C). так, например, ваша функция может выглядеть следующим образом:
size_t sum (ArrayRef<size_t> view){
return std::accumulate(view.begin(),view.end(),0);
}
и вызвать его с помощью C-массива:
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
).
То, что я подразумевал под шаблоном параметра, было его шаблон, чтобы он мог захватывать информацию о размере с ним, например 'T (& arr) [N]' или что-то в этом роде. Это имеет смысл, хотя, я не знал, что он предназначен для всех разных типов типа «массив» – Curious
Он служит базовым классом для всех этих типов ссылок на массивы. Проблема, которую он решает, по-видимому, обрабатывает все производные классы равномерно в АСТ. –
Я не думаю, что я последую за ними ... не можете ли вы просто создать шаблон аргумента и принять какой-либо другой тип массива любой длины? аналогично тому, что делает std :: array? – Curious
Он используется для _represent_ таких массивов в представлении синтаксиса, насколько я понял. –