wirken template-Spezialisierungen sich auch auf abgeleitete templates aus?



  • folgendes Szenario: ich habe ein template-struct mit typedefs und ein paar structs, die davon erben:

    template <typename LType, typename RType>
    struct addition_like_traits {
      typedef foo result_type;
    };
    
    template <typename LType, typename RType>
    struct add_traits : public addition_like_traits {
    };  //add_traits<X,Y>::result_type ist jetzt foo
    
    template <typename LType, typename RType>
    struct diff_traits : public addition_like_traits {
    };
    

    wenn ich das basis-template jetzt nach der definition der abgeleiteten templates spezialisiere, erben dann die abgeleiteten templates davon?

    template<>
    struct addition_like_traits<int, double> {
      typedef result_type double;
    }; //ist add_traits<int, double>::return_type jetzt double oder noch foo?
    

  • Mod

    weder noch, Templates können nicht erben, nur Klassen tun das, folglich musst du in der Basisklassenliste schon die jeweilige Spezialisierung angeben, von der geerbt werden soll:

    template <typename LType, typename RType>
    struct add_traits : public addition_like_traits<LType,RType> {
    };
    

    Falls du jetzt addition_like_traits wie angegeben explizit spezialisierst, wird diese Klasse immer an Stelle des Primärtemplates für diese Templateargumente verwendet werden (das ist ja der Sinn der Sache).

    add_traits<int,double> erbt (sofern es nicht seinerseits anders spezialisiert wurde) von addition_like_traits<int, double>.
    addition_like_traits<int, double> wurde von dir explizit spezialisiert und wird an Stelle der entsprechenden Ausprägung des Primärtemplates verwendet.

    Wichtig ist nur, dass die explizite Spezialisierung durchgeführt wird, bevor das Primäretemplate add_traits für die gleichen Templateargumente explizit oder implizit instantiiert wird.



  • camper schrieb:

    weder noch, Templates können nicht erben, nur Klassen tun das,

    Klar, war blöd hingeschrieben, sry.

    add_traits<int,double> erbt (sofern es nicht seinerseits anders spezialisiert wurde) von addition_like_traits<int, double>.
    addition_like_traits<int, double> wurde von dir explizit spezialisiert und wird an Stelle der entsprechenden Ausprägung des Primärtemplates verwendet.

    Wichtig ist nur, dass die explizite Spezialisierung durchgeführt wird, bevor das Primäretemplate add_traits für die gleichen Templateargumente explizit oder implizit instantiiert wird.

    Genau das wollte ich erreichen, danke 🙂

    bevor ich groß weitermache, noch eine Frage: gibt es bereits eine Bibliothek, die wie bei mir angedeutet die Ergebnitypen von Operatoren via typedefs in templates angibt? Wird sonst ne Heidenarbeit, das für alle möglichen standardtypen zu machen...


Anmelden zum Antworten