Typedef in Template-Argument



  • volkard schrieb:

    Sorry, ich habe vergessen zu sagen, wo das Problem liegt.

    main.cpp|8|instantiated from here|
    main.cpp|4|error: invalid use of incomplete type 'struct derived'|
    main.cpp|7|error: forward declaration of 'struct derived'|
    

    Ja, schon klar. Also generell nicht möglich oder?



  • imho nicht ohne das ganze(derived) aufzusplitten.



  • Okay, hab's hinbekommen 😉

    template<class T>
    struct ExtractType;
    
    template<template<class> class T, class U>
    struct ExtractType<T<U>>
    {
    	typedef U type;
    };
    
    struct other
    {
    	typedef double type;
    };
    
    template<typename T>
    struct base
    {
    	typedef typename ExtractType<T>::type T0;
    	typedef typename T0::type T1;
    };
    
    template<typename U = other>
    struct derived : base<derived<U>>
    {
    };
    


  • Oder halt Traits nehmen, wenns losgelöster sein soll.

    template <class Key>
    struct TypeMap;
    
    template <>
    struct TypeMap<MyClass>
    {
        typedef int Type;
    };
    
    template <>
    struct TypeMap<OtherClass>
    {
        typedef short Type;
    };
    

    Mit Makros kannst du das sogar kompakt und übersichtlich darstellen:

    TYPE_MAP(MyClass, int)
    TYPE_MAP(OtherClass, short)
    


  • FrEEzE2046 schrieb:

    Okay, hab's hinbekommen 😉

    template<class T>
    struct ExtractType;
    
    template<template<class> class T, class U>
    struct ExtractType<T<U>>
    {
    	typedef U type;
    };
    
    struct other
    {
    	typedef double type;
    };
    
    template<typename T>
    struct base
    {
    	typedef typename ExtractType<T>::type T0;
    	typedef typename T0::type T1;
    };
    
    template<typename U = other>
    struct derived : base<derived<U>>
    {
    };
    

    Welchen Vorteil bringt dir das zusätzliche struct other?

    template<class T>
    struct ExtractType;
    
    template<template<typename> class T, typename U>
    struct ExtractType<T<U> >
    {
        typedef U type;
    };
    
    template<typename T>
    struct base
    {
        typedef typename ExtractType<T>::type myType;
    };
    
    template<typename T = double>
    struct derived : base<derived<T> >
    {
        typedef T type;
    };
    

    Gruß,
    XSpille

    EDIT: Dann noch ein zusätzlicher typedef und du hast exakt dein gewolltes Konstrukt (ohne internes struct als Work-Around)



  • type haengt vielleicht eben nicht von T ab...



  • Shade Of Mine schrieb:

    type haengt vielleicht eben nicht von T ab...

    So ist es. Der Type in derived ist in allen Template-Varianten gleich ...



  • FrEEzE2046 schrieb:

    Shade Of Mine schrieb:

    type haengt vielleicht eben nicht von T ab...

    So ist es. Der Type in derived ist in allen Template-Varianten gleich ...

    Deswegen habe ich ja noch den typedef vorgeschlagen...

    Alles klar...
    Bei deiner Variante ist er ja immer gleich:

    struct otherB 
    { 
        typedef int type; 
    };
    
    derived<otherB> d;
    

    Das zusätzliche struct 'erschwert' zwar eine Verwendung eines anderen Typen,
    aber das kann doch wohl nicht wirklich Ziel dieses structs sein...

    EDIT: Wenn dir allerdings das typedef nicht gefällt, kannst du ja nochmal einen
    Typ von dem Template ableiten, dann kannste ihn garantiert nicht ändern.
    Ich persönlich finde es allerdings albern.



  • Hallo,

    ich bin auf diesen Thread gestoßen und Frage mich,
    ob man so ein Konstrukt auch allgemein für typedefs
    mit unterschiedlichen Namen machen kann.
    Als Template-Parameter kann man ja afaik keinen String übergeben.
    Angenommen ich habe eine Klasse mit einem typedef für typeB,
    muss ich so eine Klasse dann wirklich noch einmal analog schreiben
    oder gibt es eine andere Möglichkkeit?

    template<class T> 
    struct ExtractType; 
    
    template<template<typename> class T, typename U> 
    struct ExtractType<T<U> > 
    { 
        typedef U type; 
    };
    

    Gruß,
    Definer



  • Definer schrieb:

    ich bin auf diesen Thread gestoßen und Frage mich,
    ob man so ein Konstrukt auch allgemein für typedefs
    mit unterschiedlichen Namen machen kann.

    Welches Konstrukt meinst du jetzt genau? Kannst du es vielleicht mit ein wenig Code verdeutlichen? Bei deinem Post sehe ich nämlich den Zusammenhang zwischen Text und Code nicht wirklich.



  • Nexus schrieb:

    Definer schrieb:

    ich bin auf diesen Thread gestoßen und Frage mich,
    ob man so ein Konstrukt auch allgemein für typedefs
    mit unterschiedlichen Namen machen kann.

    Welches Konstrukt meinst du jetzt genau? Kannst du es vielleicht mit ein wenig Code verdeutlichen? Bei deinem Post sehe ich nämlich den Zusammenhang zwischen Text und Code nicht wirklich.

    Danke dir Nexus, aber ich glaub ich war wohl etwas verwirrt...


Anmelden zum Antworten