Вы можете либо передать std::vector
, либо использовать template
:
template <std::size_t N1, std::size_t N2, std::size_t N3> // and so on...
void work_with_arrays(double (&arr1)[N1], double (&arr2)[N2], double (&arr3)[N3]){
std::cout << "First arr of a size: " << N1 << "\n";
std::cout << "Second arr of a size: " << N2 << "\n";
std::cout << "Third arr of a size: " << N3 << "\n";
};
int main() {
double something[32];
double fewer[13];
double maybe_byte[8];
work_with_arrays(something, fewer, maybe_byte);
}
Код выводится:
First arr of a size: 32
Second arr of a size: 13
Third arr of a size: 8
Объяснение:
Следует знать, что аргумент типа T[]
(T
- любого типа) распадается до T*
.Если мы имеем дело с указателем на массив, у нас нет информации о его длине, что весьма прискорбно, учитывая тот факт, что длины массивов фиксированной длины известны во время компиляции и могут быть видны везде, где мы работаем с ними.
Следует также знать, что шаблон функции является , а не функцией.Это шаблон, используемый для создания функций.Для каждого другого набора N#
, использованного в примере выше, для нашего использования будет сгенерирована функция.
Какой обходной путь существует для проблемы распада?
Вместо передачи необработанного T[]
, мы должны передать ссылку на T[]
.Таким образом, тип не исчезает, и размер массива будет известен.
Синтаксис?
Можно заметить, что T (&name)[some_size]
выглядит как минимум странно.Скобки обязательны, так как обычный T &name[size]
будет интерпретирован как T& name[size]
, который является массивом ссылок , а не ссылкой на массив .
Вывод:
Будучи в состоянии определить размер массива, переданного в качестве аргумента, мы не хотим ограничивать себя одним или двумя случаями - мы хотим покрытьвсе они , поэтому мы используем template
для генерации функций с N#
необходимого значения.