How to write a template function that takes an array and an int specifying array size
23,812
Solution 1
The correct way to write it is
#include <iostream>
template <typename T, size_t size> void print(const T (&array)[size])
{
for(size_t i = 0; i < size; ++i)
std::cout << array[i] << " ";
}
int main() {
int arr[] = { 1,2,3,4,99};
print(arr);
}
Prints
1 2 3 4 99
Solution 2
If you want to pass the array by reference, you could
template <typename T, size_t SIZE>
void print(const T(&array)[SIZE])
{
for (size_t i = 0; i < SIZE; i++)
std::cout << array[i] << " ";
}
and then, e.g.
int x[] = {1, 2, 3};
print(x);
Otherwise, you can pass it by pointer, note that the array will decay to pointer, and you have to guarantee the correctness of SIZE
being passed.
template <typename T>
void print(const T array[], size_t SIZE)
{
for(size_t i = 0; i < SIZE; i++)
std::cout << array[i] << " ";
}
and then, e.g.
int x[] = {1, 2, 3};
print(x, sizeof(x) / sizeof(int));
Author by
willfo
Updated on July 21, 2022Comments
-
willfo almost 2 years
For a university exercise, I have been asked to write a template function "print();", which takes two arguments, 1: an array of a generic type, and 2: an int specifying the size of the array. The function should then print out every item in the array to the console. I am having some trouble with the function arguments. The code I currently have is:
template <typename Type> Type print (Type a, Type b) { Type items; Type array; a = array; b = items; for (int i = 0; i < items; i++) { std::cout << std::endl << "The element of the index " << i << " is " << array << std::endl; std::cout << std::endl; }
and in main():
print(Array[], 10);
Obviously putting Array as an argument isn't returning a value, so I am not sure what else to do. Any ideas?
-
willfo over 8 yearsThank you, what exactly would I put in as an argument when I call the function in main? If you could give me a quick example that would be great, I'm new to c++!
-
Bartek Banachewicz over 8 yearsNeeds more range-for. Boost.Range
indexed
if indices are needed ;) -
sehe over 8 years@willfo added a live sample
-
sehe over 8 yearsNote that passing (pointer+size) is a bit of an anti-pattern in C++. GSL defines
array_view
for precisely this reason -
Nathan29006781 about 2 yearsWhy can't we pass the array by value?
-
sehe about 2 years@Nathan29006781 that's how the language is defined - it decays to a pointer. That's actually just a C-compatibility relic. So, if you want consistency, you totally can: use
std::array
although in a scenario that simple I'd considerinitializer_list