0 Tage Serie
cpp / expert
Snippet

Perfekte Weiterleitung mit variadischen Templates und std::forward

Implementiert 'Perfekte Weiterleitung', um Argumente genau so an einen Konstruktor zu übergeben, wie sie empfangen wurden (unter Beibehaltung des Lvalue/Rvalue-Status). Dies vermeidet unnötige Kopien und ermöglicht Move-Semantik für komplexe Objekte.

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");
Erklärung
1
typename... Args
Definiert ein Template-Parameter-Pack für eine beliebige Anzahl von Argumenten.
2
Args&&... args
Universelle Referenzen (Forwarding-Referenzen), die an jeden Argumenttyp binden können.
3
std::forward<Args>(args)...
Expandiert das Pack und behält dabei die Wertkategorie jedes Arguments bei.