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)...);
}