Variadic Templates in eurem "Überblick über C++09" - Deklaration Fehler oder gewollt?
-
Hier wird ja das Template-Struct count_args mit einem Template-Parameter deklariert, das einen "Parameter-Pack" darstellt (...Args):
//count_args zählt, mit wie vielen Template-Parametern es instanziiert wird template <typename ...Args> struct count_args;Hier kommt dann auf einmal noch ein Template-Parameter (T) ins Spiel, hat das so seine Richtigkeit?
template <typename T, typename ...Args> struct count_args<T, Args...> { static int const value = 1 + count_args<Args...>::value; };Hier wird doch T auch wieder nicht verwendet:
static int const value = 1 + count_args<Args...>::value;
-
Achso ich glaub ich habs verstanden: Damit es nicht in einer endlosen Rekursion endet, wird noch ein "Dummy"-Parameter angegeben, der den ersten entpackten Typen aufnimmt. Dann macht alles Sinn

Wäre schön, wenn das noch im Artikel erwähnt werden würde.
-
Abgesehen davon, dass man dieses Klassentemplate nicht braucht -- denn es gibt ja den sizeof...-Operator -- ja, das hat so seine Richtigkeit.
template<class...Args> struct count_args { static int value = 0; }; template<class T, class...Rest> struct count_args<T, Rest...> { static int value = 1 + count_args<Rest...>::value; }Für count_args<> greift das "Mutter-Template" mit value=0.
Alles andere sind Fälle mit mindestens einem Typparameter, also <T,Mehr...> wobei Mehr ein leeres Argumentpack sein kann. Da greift also die partielle Spezialisierung.