template declaration of typedef nicht erlaubt?



  • Servus,

    ich habe eine Templateklasse, die von drei Parametern abhängt. Für einen Teil meines Programms sind aber die ersten beiden Template-Argumente fix und ich würde daher gerne aus Schreibarbeitsgründen einen typedef anlegen. Das geht aber nicht, da ja ein Parameter frei bleiben muss:

    template <typename A, typename B, typename C>
    class Foo{
        // declarations..
    };
    
    // Statt Foo<Bar, Blah, int> würde ich gerne Blubb<int> schreiben wollen:
    template <typename T>
    typedef Foo<Bar, Blah, T> Blubb<T>
    

    Das moniert der Kompiler (gcc 4.4) mit einem schlichten
    "error: template declaration of ‘typedef’"

    Gibt's einen Weg hier eine convenience-Typedef zu machen?

    Gute nacht,
    Phil



  • Ich glaube das geht erst mit dem neuen Standard... bin mir aber nicht sicher.



  • Template Typedefs sind nicht möglich. Im nächsten C++-Standard wird es Template Aliases geben.

    Momentan kannst du dir sowas basteln:

    template <typename T>
    struct Blubb
    {
        typedef Foo<Bar, Blah, T> Type;
    };
    


  • http://www.drakon.ch/
    Siehe template alias im Beitrag vom 27. Dezember 2009...
    Simon



  • Ahh danke, das mit dem struct funktioniert !

    Ich glaube, ich hab letztes Jahr zuviel Scheme programmiert... Ständig möchte ich aus Funktionen mit 4 Parametern durch setzen zweier Parameter Funktionen mit zwei Parametern erzeugen, und jetzt wo das mit boost::lambda geht, versuche ich diese Denkweise auf Templates zu übertragen.



  • PhilippM schrieb:

    Ständig möchte ich aus Funktionen mit 4 Parametern durch setzen zweier Parameter Funktionen mit zwei Parametern erzeugen, und jetzt wo das mit boost::lambda geht

    Wäre für das Binden von Argumenten nicht eher Boost.Bind geeignet?

    Keine Sorge, mit C++0x eröffnen sich unter anderem neue Möglichkeiten hinsichtlich funktionaler Programmierung, da z.B. Lambda-Ausdrücke direkt als Sprachmittel angeboten werden. 😉



  • Nexus schrieb:

    PhilippM schrieb:

    ...jetzt wo das mit boost::lambda geht

    Wäre für das Binden von Argumenten nicht eher Boost.Bind geeignet?

    Mein ich doch... Aber lambda ist auch fein 😉

    Hat nur leider alles den Nachteil, das die WTF-Rate*) beim reviewen meines Codes (durch die Leute, die Templates nur alle heiligen Zeiten mal benutzen) in letzter Zeit extrem angestiegen ist:

    * http://www.osnews.com/images/comics/wtfm.jpg



  • Naja, und was dahinter steckt, ist auch nicht ganz ohne. Der Typ des Ausdrucks

    _1 > 15 && _2 < 20
    

    ist zum Beispiel

    lambda_functor<
        lambda_functor_base<
            logical_action<and_action>,
            tuple<
                lambda_functor<
                    lambda_functor_base<
                        relational_action<greater_action>,
                        tuple<
                            lambda_functor<placeholder<1> >,
                            int const
                        > 
                    > 
                >,
                lambda_functor<
                    lambda_functor_base<
                        relational_action<less_action>,
                        tuple<
                            lambda_functor<placeholder<2> >,
                            int const 
                        > 
                    > 
                >
            > 
        > 
    >
    

    (Quelle: http://www.boost.org/doc/libs/1_35_0/doc/html/typeof.html)

    Boost.Bind gefällt mir sehr, vor allem in Verbindung mit Boost.Function, aber Boost.Lambda benutze ich selbst nicht...



  • Und ich wunder mich immer, warum an meinem Notebook der CPU-Lüfter aufdreht, wenn ich was kompiliere... 😃



  • PhilippM schrieb:

    Und ich wunder mich immer, warum an meinem Notebook der CPU-Lüfter aufdreht, wenn ich was kompiliere... 😃

    LOL



  • Also wenn ich Nexus Code so sehe, frage ich mich ob ich kotzen oder die Hand in die Hose führen soll.



  • theta schrieb:

    http://www.drakon.ch/
    Siehe template alias im Beitrag vom 27. Dezember 2009...
    Simon

    Es gibt auch Dierct Links:
    http://www.drakon.ch/?id=&offset=&mobile=0&show_entry=84

    Einfach auf den Titel des Beitrages klicken und dann hat man den Beitrag einzeln.
    (das verlinken mit Datum hat mich auch immer genervt, darum habe ich das dann auch eingebaut. :))


Anmelden zum Antworten