2016-12-27 12 views
2

Я наткнулся на это http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html, и я пытаюсь понять, для чего он предназначен.Назначение ArrayRef

Я не могу понять, какая проблема ArrayRef решает, может кто-то объяснить причину этого?

+0

Он служит базовым классом для всех этих типов ссылок на массивы. Проблема, которую он решает, по-видимому, обрабатывает все производные классы равномерно в АСТ. –

+0

Я не думаю, что я последую за ними ... не можете ли вы просто создать шаблон аргумента и принять какой-либо другой тип массива любой длины? аналогично тому, что делает std :: array? – Curious

+0

Он используется для _represent_ таких массивов в представлении синтаксиса, насколько я понял. –

ответ

4

Это та же идея, что и у 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).

+0

То, что я подразумевал под шаблоном параметра, было его шаблон, чтобы он мог захватывать информацию о размере с ним, например 'T (& arr) [N]' или что-то в этом роде. Это имеет смысл, хотя, я не знал, что он предназначен для всех разных типов типа «массив» – Curious