Если вы ожидаете, что сможете просто сделать func(v)
, вы не сможете этого сделать, потому что я никак не могу подумать о том, что ваша функция могла бы определить размер динамически распределенного int[numElements]
.
Хороший способ обернуть это - взять пару прямых итераторов, то есть, если вам нужно только перебирать элементы по одному, поскольку произвольный доступ очень плох для некоторых контейнеров, таких как std::list
.
template<class FWIt>
void func(FWIt a, const FWIt b)
{
while (a != b)
{
std::cout << "Value: " << *a << '\n';
++a;
}
}
template<class T>
void func(const T& container)
{
using std::begin;
using std::end;
func(begin(container), end(container));
}
Это будет работать со следующим:
int array[5] = {1, 2, 3, 4, 5};
func(array);
int* dynarray = new int[5]{1, 2, 3, 4, 5};
func(dynarray, dynarray + 5);
std::vector<int> vec{1, 2, 3, 4, 5};
func(vec);
func(vec.begin(), vec.end());
std::list<int> list{1, 2, 3, 4, 5};
func(list);
Редактировать: Это также работает, передавая необработанные массивы напрямую, а не в виде двух указателей, благодаря изменению @ DanielH (но все равно не будет работать с динамически размещаемыми массивами).