kosten bei template vererbung
-
Hallo,
ich frag mich gerade folgendes und finde keine Antwort und jetzt hoffe ich das mir hier jemand weiter helfen kann.folgendes:
template<typename T> class Foo{ T& value(){return val;} protected: T val; }; template<typename T> class Bar : public Foo<T>{ public: using value_type = T ; };ist in diesem Fall Bar 'teurer' als wenn es so implementiert wåre?
template<typename T> class Bar{ T& value(){return val;} protected: T val; };Grund:
ich könnte mit std::is_base_of Operationen für das 'Konzept' Foo machen,
möchte aber keine zusätzlichen Kosten haben.und mir Fällt kein anderes type_traits ein welches ich so verwenden könnte.
Praktisches Bsp wäre zB ein globaler minus Operator der nur für einige Typen gefunden werden soll die das 'Konzept' Foo implementieren
template<class T, class ValT = typename T::value_type> typename std::enable_if< std::is_base_of<Foo<ValT> , T>::value, T>::type operator-(const T& in) { return { -in.value() }; }
-
ich könnte mit std::is_base_of Operationen für das 'Konzept' Foo machen,
möchte aber keine zusätzlichen Kosten haben.Was genau verstehst du unter Kosten?
Ob es länger kompiliert?und mir Fällt kein anderes type_traits ein welches ich so verwenden könnte.
Es gibt haufenweise Möglichkeiten, einen Typ von anderen zu Unterscheiden, eine Basisklasse ist nur eine davon.
-
unter 'Kosten' meine ich zb einen vtable welcher sich im micro benchmark theoretisch bemarkbar machen könnte, oder Bar etwas grösser macht.
bei keinem Template wäre das ja der Fall denke ichda ich Foo als Basis aber nur als Template verwenden könnte (ohne explizit zu überladen)
template<typename T> int getval(const Foo<T>& f) {return f.value() ;}frage ich mich ob ich diese Basisklasse ganz umsonst haben kann.
wenn es einen anderen Weg, ausser boost_has_member, gibt, mit c++11 möglichkeiten das 'Konzept' zu realiseren, welcher könnte das sein?
mein konkreter Anwendugsfall wären alle Klassen welche Methode x und y implementiert haben sowie ein bestimmtes typedef besitzten.mir ist klar das das jetzt 2 fragen geworden sind, hoff das ist kein Problem
-
kurze_frage schrieb:
wenn es einen anderen Weg, ausser boost_has_member, gibt, mit c++11 möglichkeiten das 'Konzept' zu realiseren, welcher könnte das sein?
mein konkreter Anwendugsfall wären alle Klassen welche Methode x und y implementiert haben sowie ein bestimmtes typedef besitzten.mir ist klar das das jetzt 2 fragen geworden sind, hoff das ist kein Problem
Du schreibst dir dein persönliches has x und has y und has typedef, kombinierst die bedingungen via && und hast dein persönliches is_concept.
-
kurze_frage schrieb:
vtable
vtable gibt es nur und ausschliesslich wenn in du irgenwo "virtual" stehen hast. Sonst absolut nie.
-
Nathan schrieb:
Du schreibst dir dein persönliches has x und has y und has typedef, kombinierst die bedingungen via && und hast dein persönliches is_concept.
und ich glaub das kann ich nicht mit board mitteln, bzw weiss nicht wie, werde es aber morgen noch mal probieren ob ich etwas finden kann.
-
xtable schrieb:
kurze_frage schrieb:
vtable
vtable gibt es nur und ausschliesslich wenn in du irgenwo "virtual" stehen hast. Sonst absolut nie.
ok, danke
-
kurze_frage schrieb:
Nathan schrieb:
Du schreibst dir dein persönliches has x und has y und has typedef, kombinierst die bedingungen via && und hast dein persönliches is_concept.
und ich glaub das kann ich nicht mit board mitteln, bzw weiss nicht wie, werde es aber morgen noch mal probieren ob ich etwas finden kann.
Natürlich kannste das mit Boardmitteln, wie soll boost das sont machen?
Das Stichwort hierfür ist SFINAE und das damit verbundene Überladungsauswahlverfahren.