From C++11 on, you can use variadic templates functions with the following
syntax:
template< typename T, typename... A >
This, combined with function overloading (where the same named function taking
different parameters) means we can design a class that operate on a list of
different types of objects