Array type deduction in a function template
Asked Answered
U

2

12

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!

Unworldly answered 24/6, 2012 at 17:8 Comment(0)
S
14

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]) { ... }
Sheryllshetland answered 24/6, 2012 at 17:11 Comment(0)
F
6

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
Function answered 24/6, 2012 at 17:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.