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?
-
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...