type trait gesucht um zu überprüfen ob ein Typ ein Klassen-Template instanziiert



  • Ich möchte einfach überprüfen ob ein Typ eine Instanz eines Templates ist.
    z.b:

    std::vector<int> => Template
    int => Kein Template
    

    Hätte gedacht das ist ziemlich simpel.

    template<typename T>
    struct is_template : std::false_type
    {
    };
    
    template<template <typename... > class T, typename...Args>
    struct is_template<T<Args...>> : std::true_type
    {
    };
    

    Ist es aber nicht.
    Das Problem sind integrale template parameter wie im std::array.

    is_template<std::array<int, 2>>::value // ist 'false'
    

    http://ideone.com/a2sM09

    Hat jemand eine Idee wie man es trotzdem hinbekommt? 😕

    Zusatzaufgabe: Ich müsste dann auch noch alle template parameter in einer typ liste speichern


  • Mod

    Eine allgemeingültige Lösung gibt es hierfür nicht. Schon die Behandlung von non-type Templateparametern bereitet bisher Probleme, weil der Typ bekannt sein musste und nicht deduziert werden konnte. Ab C++17 ist es zumindest diesbzgl. möglich, auto als Typspezifier zu verwenden. Weitere Schwierigkeiten bereitet es, dass type- und non-type Parameter in beliebiger Reihenfolge auftauchen können, während ein Templateparameterpack nat. nur jeweils Elemente einer Art Parameter haben kann.
    Und nicht zu vergessen Templatetemplateparameter:
    Der Templatetemplateparameter eines solchen Templates benötigt unter Umständen selber einen Templatetemplateparameter und so weiter:

    template<template<template<template<template<template<auto>class>class>class>class>class> struct foo;
    

    Praktisch gesehen ist es nat. nicht allzu schwer 99% aller Fälle zu lösen, in dem man sich auf typische Parameterkombinationen beschränkt und mit ein bisschen Präprozessormagie muss das nicht unbedingt viel Code erfordern.


  • Mod

    Ich hatte mal angefangen ein Paper für allgemeine Templateparameter zu schreiben. Es gab dafür auch immer mal hier und da in EWG Papern ein paar Ideen. Die Motivation für diese Dinge ist aber minimal, ich sehe da wenig Potential.

    Ich rieche hier außerdem XY.



  • Wenn is_template wirklich für etwas Sinn macht, dann könnte man im Standard ja einfach vorschreiben dass es die Standard Library anbieten muss. Die muss dann halt ne Compiler-Extension verwenden, aber diese Compiler-Extension zu implementieren sollte trivial sein.


Log in to reply