При передаче контейнеров по ссылке лучше использовать автоматический параметр или шаблон? - PullRequest
0 голосов
/ 27 мая 2018

Каковы различия, если таковые имеются, между

template <typename T, int N>
void input (T (&Array) [N])
{
    for (T& val: Array) cin >> val;
}

и

template <typename T>
void input (T (&Array))
{
    for (auto& val: Array) cin >> val;
}

и

void input (auto& Array)
{
    for (auto& val: Array) cin >> val;
}

?

Что являетсялучше?

Все они работают правильно с double store[5], но не с vector <double> store

Примечание: первая версия не будет компилироваться с T (&Array) [], так как это ссылка намассив неизвестных границ ".Второй не скомпилируется, если мы напишем T& val: Array.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Как указал Фрэнк, первая версия принимает только массивы, в то время как вторая и третья также могут принимать vector или list

Вторая и третья версии не работаютс vector <double> store, поскольку цикл for не выполняется, когда вектор пуст.

Вместо этого замените его на vector <double> store (5, 0).

0 голосов
/ 28 мая 2018

В случае аргумента массива все они имеют одинаковое поведение.В первом T выводится на тип элемента;в других T или auto выводит тип массива.

Конечно, вторая и третья формы (которые эквивалентны, за исключением того, что вы не можете написать специализацию для auto).) разрешить передачу аргументов без массивов.

...