C++
Beginner
1 min read
Variadic Templates and Parameter Packs
Example
#include <iostream>
#include <string>
#include <tuple>
// C++17 fold expression: sum any number of values
template<typename... Args>
auto sum(Args&&... args) {
return (args + ...); // fold over +
}
// Variadic print using fold over comma operator
template<typename... Args>
void printAll(Args&&... args) {
((std::cout << args << " "), ...);
std::cout << "\n";
}
// Recursive variadic: count arguments
template<typename... Args>
constexpr std::size_t countArgs(Args&&...) {
return sizeof...(Args);
}
// Perfect-forwarding factory
template<typename T, typename... Args>
T* createRaw(Args&&... args) {
return new T(std::forward<Args>(args)...);
}
struct Point {
Point(double x, double y, double z)
: x(x), y(y), z(z) {}
double x, y, z;
void print() const {
std::cout << "Point(" << x << "," << y << "," << z << ")\n";
}
};
int main() {
std::cout << sum(1, 2, 3, 4, 5) << "\n"; // 15
std::cout << sum(1.5, 2.5, 3.0) << "\n"; // 7.0
printAll("Hello", 42, 3.14, std::string("world"));
std::cout << countArgs(1,'a',"hi",3.14) << "\n"; // 4
Point* p = createRaw<Point>(1.0, 2.0, 3.0);
p->print();
delete p;
// std::tuple uses variadic templates internally
auto t = std::make_tuple(1, std::string("hi"), 3.14);
std::cout << std::get<0>(t) << " " << std::get<1>(t) << "\n";
return 0;
}