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.


Anmelden zum Antworten