typedef auf Parameter Packs



  • Gibt es einen Grund, warum man ein Parameter-Pack nicht typedef-en kann? Mir wurde mal gesagt, das würde keinen Sinn ergeben. Wenn ich einen neuen namen für einen Typen einführen darf, warum nicht auch für ein Parameter-Pack? Das würde vielen generischen Code drastisch vereinfachen.



  • was ist fuer dich ein parameter pack?



  • template <typename... Args>
    struct mystruct
    {
        typedef Args... MyArgs...; // Nicht erlaubt
    };
    


  • Weil das hier kein Typ ist?

    Wenn es dir nur ums exposen geht, kannst du das einfach in einen neuen Typen wrappen.



  • Args... ist auch kein Typ, und trotzdem kann ich es mit einem einzigen Namen ansprechen. Mir leuchtet diese Begründung nicht ein.



  • 314159265358979 schrieb:

    Args... ist auch kein Typ, und trotzdem kann ich es mit einem einzigen Namen ansprechen. Mir leuchtet diese Begründung nicht ein.

    Deshalb hast du ja die ...
    Du kannst die ... in einer variadic Funktion ja auch nicht typedefen.
    foo... ist ein spezielles Syntax Element dass zu einer typelist expandiert.

    Du kannst diesen "Typen" ja auch nicht instanziieren...

    PS:
    statt ein typedef auf Args... zu machen, kannst du aber ein typedef auf TypeList<Args...> machen - und somit auch etwas damit anfangen.



  • Dann eben

    typedef Args MyArgs;
    

    Hier würde nichts expandiert werden, somit kann man Args als "Einheit" ansehen.



  • Ich kann aber immer noch kein:

    Args foo;

    machen. Ergo ist Args immernoch etwas anderes als ein normaler Typ.
    Ein typedef bringt also auch nicht viel. Wie gesagt: zum exposen von Args nach aussen, ist ein neuer Typ sinnvoller.



  • Wie wärs mit einem Variadic typedef?

    typedef... Args MyArgs;
    

    Ich sehe keinen Grund, sowas zu verbieten.



  • 314159265358979 schrieb:

    Ich sehe keinen Grund, sowas zu verbieten.

    Ich sehe auch keinen Grund, Default-Template-Argumente für Template-Funktionen zu verbieten (nur so als Ergänzung).



  • EOutOfResources schrieb:

    314159265358979 schrieb:

    Ich sehe keinen Grund, sowas zu verbieten.

    Ich sehe auch keinen Grund, Default-Template-Argumente für Template-Funktionen zu verbieten (nur so als Ergänzung).

    Darüber hab ich mich auch schon geärgert. 😉



  • 314159265358979 schrieb:

    Wie wärs mit einem Variadic typedef?

    typedef... Args MyArgs;
    

    Ich sehe keinen Grund, sowas zu verbieten.

    Es ist ja nicht verboten sondern nur nicht erlaubt.
    Grosser Unterschied. Es wuerde eine Menge Situationen ziemlich komplex zum aufloesen machen. Deshalb hat man das Feature weggelassen, da man eine Menge anderer Sachen anpassen muesste.

    @EOutOfResources:
    Das feature heisst: Funktionsueberladung.
    Deshalb gibt es das nicht. Es mag vielleicht moeglich sein ohne Probleme default Template Parameter fuer Funktionen in die Sprache einzubauen ohne mehrdeutigkeiten zu haben: aber wozu? Wir haben das Feature ja schon mit Ueberladung.

    PS:
    Solche Sachen wurden deshalb nicht einfach verboten weil jemand das uncool vorkam wenn das moeglich waere - sondern der Aufwand wurde nicht aufgebracht um diese Features einzubauen. Denn solche Features hat man nicht einfach so - das ist viel Arbeit und kann uU an anderen Stellen Probleme bereiten. Und diese 2 Features hier sind trivial anders loesbar ohne einen rattenschwanz an komplexitaet mit sich zu ziehen.



  • Shade Of Mine schrieb:

    @EOutOfResources:
    Das feature heisst: Funktionsueberladung.
    Deshalb gibt es das nicht. Es mag vielleicht moeglich sein ohne Probleme default Template Parameter fuer Funktionen in die Sprache einzubauen ohne mehrdeutigkeiten zu haben: aber wozu? Wir haben das Feature ja schon mit Ueberladung.

    Es ist Mehraufwand:

    //Mit Default-Template-Argument für Funktionen
    template<class T, T Inst = T()>
    void Func()
    {
    }
    //Und ohne
    template<class T, T Inst>
    void Func()
    {
    }
    template<class T>
    inline void Func()
    {
      Func<T, T()>();
    }
    

    Man sieht's, auf mehr als das doppelte gewachsen. Scheisst mich jetzt aber nicht wegen der Sinnlosigkeit an...



  • EOutOfResources schrieb:

    Es ist Mehraufwand:

    Tipparbeit zaehlt nicht.

    Leg dir in deiner IDE ein template dafuer an, dann ists ein klick...

    PS:
    manche Sachen waeren nett zu haben - aber es braucht alles eine gewissen Zeitinvestition bei der Standardisierung und da muss man dann abwaegen wo die Zeit reinfliessen soll. Bei default parametern fuer Function Templates ist es so, dass es hier nur um Syntax Zucker geht und nicht um ein Feature dass uns wirklich weiter bringt. Ich glaube in C++0x sind sie sogar eingebaut... Aber wirklich essentiell sind sie nicht. Einfach nur "nice to have".

    Da haette ich lieber sowas wie Concepts oder derartiges, was einen wirklichen Mehrwert bringt.


  • Administrator

    314159265358979 schrieb:

    Gibt es einen Grund, warum man ein Parameter-Pack nicht typedef-en kann? Mir wurde mal gesagt, das würde keinen Sinn ergeben. Wenn ich einen neuen namen für einen Typen einführen darf, warum nicht auch für ein Parameter-Pack? Das würde vielen generischen Code drastisch vereinfachen.

    Rein aus Interesse: Kannst du Beispiele nennen, was sich dadurch vereinfachen lässt?

    EOutOfResources schrieb:

    Man sieht's, auf mehr als das doppelte gewachsen. Scheisst mich jetzt aber nicht wegen der Sinnlosigkeit an...

    Es ist sinnlos von "auf mehr als das doppelte gewachsen" zu reden, wenn Func nicht implementiert ist 😉

    Grüssli



  • Dravere schrieb:

    Es ist sinnlos von "auf mehr als das doppelte gewachsen" zu reden, wenn Func nicht implementiert ist 😉

    Wie im Marketing 😉 .



  • Dravere schrieb:

    Rein aus Interesse: Kannst du Beispiele nennen, was sich dadurch vereinfachen lässt?

    Wenn du mich so konkret fragst: Nein. Allerdings hatte ich bei dem printer-make_var Thread eine Situation. Ich kann nacher nochmal versuchen, die Stelle zu finden.


Log in to reply