Array type deduction in a function template
-
16-06-2021 - |
Question
I have a template method as follows:-
template<typename T, int length>
void ProcessArray(T array[length]) { ... }
And then I have code using the above method:-
int numbers[10] = { ... };
ProcessArray<int, 10>(numbers);
My question is why do I have to specify the template arguments explicitly. Can't it be auto-deduced so that I can use as follows:-
ProcessArray(numbers); // without all the explicit type specification ceremony
I am sure I am missing something basic! Spare a hammer!
Solution
You can't pass arrays by value. In a function parameter T array[length]
is exactly the same as T* array
. There is no length information available to be deduced.
If you want to take an array by value, you need something like std::array
. Otherwise, you can take it by reference, which doesn't lose the size information:
template<typename T, int length>
void ProcessArray(T (&array)[length]) { ... }
OTHER TIPS
You're missing the correct argument type: arrays can only be passed by reference:
template <typename T, unsigned int N>
void process_array(T (&arr)[N])
{
// arr[1] = 9;
}
double foo[12];
process_array(foo); // fine
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow