MickSin und die Mixins
-
Hallo da!
Gegeben folgender Code:
template<typename T> class Mixin { void Call() { // Hier würde ich gerne T::SomeFunc aufrufen, falls das existiert, // oder ansonsten DefaultImpl } void DefaultImpl() { } }; class A { void SomeFunc(); }; class B : A, Mixin<B> { void SomeFunc(); };Kann man das im Kommentar beschriebene irgendwie umsetzen?
Danke schonmal für Eure Anregungen!
-
Soll
SomeFunc staticsein?#include <iostream> template<typename T> class Mixin { private: template<typename T2> static void CallImpl( decltype(&T2::SomeFunc) ) { T::SomeFunc(); } template<typename T2> void CallImpl( ... ) { DefaultImpl(); } public: void Call() { CallImpl<T>( NULL ); } void DefaultImpl() { std::cout << "Mixin::DefaultImpl\n"; } }; struct A { static void SomeFunc() { std::cout << "A::SomeFunc()\n"; } }; struct B {}; int main() { Mixin<A>{}.Call(); Mixin<B>{}.Call(); }Bei dieser Version gibt es einen schlichten Compiler-Fehler wenn
SomeFunceine nicht-statische Memberfunktion ist...
-
Spezialisiert auf non-static, static, und keine Memberfunktion: http://ideone.com/BjorWN
Diesmal auch ein wenig C++11-hafter mit diesem Trick.
-
Danke für Deine Mühen ersteinmal, ich war leider heute den ganzen Tag unterwegs und bin nun zu kirre im Kopf um noch klar darüber nachzudenken, drum schaue ich mir das morgen in alter Frische an!