Template Specialisierung
-
Hallo Leute,
ich möchte eine Template Funktion mit T als Return spezialisieren und den typ einschränken (C++03)
template<class T> T& Get(const std::size_t& index) { return *static_cast <T*>(_children[index]); }
T "muss" vom Type "class Base" und deren SubTyp "class A:public Base" ,"class B:public Base", "class C:public Base" usw.
Was ich möchte:
A Get<A>(0); //ok B Get<B>(0); //ok C Get<C>(0); //ok X Get<X>(0); //compile time error
zudem frage ich mich ob der static_cast hier die richige wahl is !?
im notfall Könnte ich auch machen
A GetA(0); B GetB(0); C GetC(0);
aber würde mich necken es mit Tempate zu machen:)
Danke euch;)
-
-
Du kannst std::enable_if auch ganz einfach selber programmieren: More C++ Idioms: enable_if
-
C++11:
#include <cstddef> #include <type_traits> struct Base{}; struct A : public Base {}; struct B : public Base {}; struct C : public Base {}; struct foo {}; template<typename T> typename std::enable_if_t<std::is_base_of_v<Base, T>, T&> Get(std::size_t index) { return T; // das ist jetzt natuerlich eine dangling reference und steht nur so // als Platzhalter fuer was auch immer da. }
Was Dein
_children
ist weiß ich leider nicht.
-
Hallo Leute,
ja leider C++03 ist ein "muss" da teile nativ auf WinCE Plattformen kompiliert werden sollen. Und verwende da Vs2008 VC++6 .. das is doch noch C++03..
sorry_children => ist ein std::vector<Base*> ...
-
Du hast mich anscheinend nicht verstanden: du kannst
enable_if
auch in C++03 (und sogar C++98) verwenden (du mußt es nur selber definieren, da es da noch nicht im Standard implementiert war), s.a. Is enable_if only C++11?PS: Falls du
boost
schon benutzt, kannst du auch einfach dessen Implementierung benutzen: boost::enable_if
-
@Th69 hast Du auch was für
std::is_base_of<>
?
-
Auch da kann ich nur
boost
empfehlen: boost::is_base_ofAber oftmals ist
is_convertible<T*, Base*>
die bessere Wahl, s.a. unter "Notes" in std::is_base_of - auch das gibt es als boost::is_convertible (boost
ist ja quasi die Spielwiese für die Standard-Library-Entwickler, daher gibt es viele Standard-Klassen schon vorher als Boost-Implementierung, und meistens auch für veraltete Compiler).Man braucht auch nicht die kompletten Boost-Libraries nehmen, in diesem Fall reicht Boost.TypeTraits.
-
@Th69 sagte in Template Specialisierung:
Auch da kann ich nur boost empfehlen:
boost::is_base_of
yay
-
@SoIntMan: Warum gibst du kein Feedback?
-
@Th69 sagte in Template Specialisierung:
Du kannst std::enable_if auch ganz einfach selber programmieren: More C++ Idioms: enable_if
Sorry @Th69 dein Ansatz is gut, muss ihn noch verstehen lernen.. bin kein C++ Experte:) Aber super idee:)
probiere ich später aus ob ich dsa hin bekomme