Variadic Function Templates
- You can have a function template that has an arbitrary number of arguments, at compile time no less.
// we will take advantage of a C++ feature called Parameter pack.
#include <iostream>
template <typename T> T Sum(T arg) { return arg; }
template <typename T, typename... Args> T Sum(T start, Args... args) {
return start + Sum(args...);
}
int main() {
std::cout << Sum<int>(1, 2, 3, 4) << std::endl;
return 0;
}
You will see this used a lot with argument forwarding in real codebases.
// Forwarding arguments without copying:
template <typename... Ts> void wrapper(Ts &&...xs) {
func(std::forward<Ts>(xs)...);
}
// Constructing objects generically
template <typename T, typename... Args> T make(Args &&...args) {
return T(std::forward<Args>(args)...);
}