0 day streak
cpp / expert
Snippet

Perfect Forwarding with Variadic Templates and std::forward

Implements 'Perfect Forwarding' to pass arguments to a constructor exactly as they were received (preserving lvalue/rvalue status). This avoids unnecessary copies and enables move semantics for complex objects.

snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
template <typename T, typename... Args>
std::unique_ptr<T> create(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
struct Node {
Node(int id, std::string name) : id(id), name(std::move(name)) {}
int id; std::string name;
};
auto n = create<Node>(1, "Entity");
Breakdown
1
typename... Args
Defines a template parameter pack for an arbitrary number of arguments.
2
Args&&... args
Universal references (forwarding references) that can bind to any type of argument.
3
std::forward<Args>(args)...
Expands the pack while maintaining the value category of each argument.