Typedef von verschachtelten Typen



  • Hallo,

    ich bekomme es gerade nicht hin und erinnere mich auch nicht, das je gelesen zu haben. Kann man ein Typedef von verschachtelten Typen erstellen? Also, ich möchte, dass "foo_t" im folgenden Code ein Typedef ist, sodass der folgende Code fehlerlos läuft:

    template <typename T> class Array<T>:
    
    // ...
    assert(typeid(Array< Array<int> >) == typeid(foo_t<int>));
    

  • Mod

    typedef deklariert ein Alias für einen Typ. Hier ist foo_t aber kein Typ sondern soll soetwas wie ein template sein. Ein derartiges Konstrukt ist mit C++ gegenwärtig nicht möglich - eine entsprechende Erweiterung in C++0x aber vorgesehen.



  • Danke für die Information.



  • Evtl. lässt sich hier etwas mit Template Template Parametern machen. Dazu müsstest du aber mal genau schreiben, was du vorhast.



  • groovemaster schrieb:

    Evtl. lässt sich hier etwas mit Template Template Parametern machen. Dazu müsstest du aber mal genau schreiben, was du vorhast.

    Na, was ich vorhatte, ist genau das: Ein Typedef mit Typenparametern benutzen. Also im Prinzip folgendes (Pseudo-C++):

    template <typename T> typedef Array< Array<T> > foo_t<T>;
    

    Das geht natürlich so nicht. Mich interessierte halt, ob es sowas in der Art über ein Typedef gibt. Das Workaround ist ja offensichtlich:

    template <typename T>
    struct foo_t : Array< Array<T> > { /* nicht-vererbte Mitglieder hinzufügen */ };
    


  • Aso, ich dachte, du willst zwei Typen vergleichen, wie im ersten Beispiel. Aber wie camper schon sagte, so ein typedef Alias ist momentan nicht möglich und wird erst im nächsten Standard kommen. Momentan behilft man sich per Ableitung, wie im zweiten Beispiel. Was aber nicht ganz unproblematisch ist. Man kann aber auch direkt in der Klasse den Typ ablegen:

    template <typename T>
    struct foo_t
    {
        typedef Array< Array<T> > type;
    };
    
    foo_t<int>::type blubb;
    

    Ist semantisch zwar besser, aber wie du siehst, fehlt hier der Syntaxzucker.


Log in to reply