generelle Templateparameter, Unterscheidung unsigned typename aufheben



  • Folgendes funktioniert ganz gut:

    template<unsigned... args>
    struct seq
    {
        static const unsigned length = sizeof...(args);
    };
    
    int main()
    {
        seq<1, 2, 3> s;
    
        std::cerr << "s::length: " << s.length << '\n';
    
        return 0;
    }
    

    Leider verbietet mir die Templatedefinition seq wie folgt zu instanziieren, obwohl der Templateparameter aktuell keine Rolle spielt:

    seq<int, int, int> s;
    

    Klar kann ich ein Template typed_seq erstellen, jedoch finde ich diese Trennung eher kuenstlich und ungeschickt. Wie kann ich obiges Sequenztemplate definieren, das sowohl unsigned's als auch Typen als Templateparameter akzeptiert?



  • Gar nicht. Geht nicht. Ich finde die Beschränkung auch völlig willkürlich und nervig.

    Mein Workaround ist, alles als Typ zu übergeben:

    template <int I> using int_ = std::integral_constant<int, I>;
    
    seq<int_<1>, int_<2>, int_<3> > s;
    

    Was besseres ist mir nicht bekannt.


  • Mod

    knivil schrieb:

    Leider verbietet mir die Templatedefinition seq wie folgt zu instanziieren, obwohl der Templateparameter aktuell keine Rolle spielt:

    seq<int, int, int> s;
    

    Ich kann nicht ganz folgen. seq nimmt doch Werte, keine Typen.

    Edit: nvm. Ich glaube, ich verstehe das Problem jetzt.



  • Der gaengige Workaround ist, alle Werte in Typen zu verpacken und dann auf Typlisten zu arbeiten. Zum erstellen einer Sequenz kann man sich natuerlich ein kleines Helferlein schreiben.
    Irgendwo gab es mal ein Proposal, der anstatt 'typename' bzw dem Typen einen Punkt '.' erlaubt, mit dem man Templates dann sowohl mit Typen, als auch mit Werten instanzieren konnte. Leider finde ich ihn gerade nicht.

    Edit: Gefunden: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3416.html
    Siehe "Bonus feature: weakly specifying parameters".


Anmelden zum Antworten