Introduction
When programming, it is common to face problems that are recurring for different types of objects, such as storing a list of objects, or searching elements in a list, or finding the maximum between two elements.
Let's say that in our program we want to be able to find the maximum between two elements, either integers or doubles. With the features we have learned so far, we could write the following code:
int max(int a, int b) { if ( a > b) return a; else return b; } double max(double a, double b) { if ( a> b) return a; else return b; }
In the previous code, the two functions are identical except for the types of the parameters and the return type. Ideally, we would like to write these kind of operations only once and reuse them in the entire program.
Moreover, our max() function can only be called with types for which an overload exists: int and double in this case. If we wanted it to work with any numerical type, we would need to write an overload for each of the...