Optionale Template-Typ-Parameter möglich? Wenn ja, wie?
-
Also, ich habe mir eine kleine Klasse geschrieben, wo ich einen Zeiger auf ein Objekt und einen Zeiger auf eine Member-Funktion dieses Objektes übergebe und dann den operator() überladen, um die Member-Funktion aufzurufen. Läuft alles super. Jetzt habe ich aber das Problem, dass die Member-Funktionen die unterschiedlichsten Parameter haben können und jede mögliche Kombination wolle ich dann doch nicht überladen.

Ich habe bisher:
template<class T, class R> class MethodPtr { public: MethodPtr(T* _Object, R (T::* _Method)()) { this->Object = _Object; this->Method1 = _Method; } R operator()() { return (*this->Object.*this->Method1)(); } MethodPtr(T* _Object, R (T::* _Method)(int, int)) { this->Object = _Object; this->Method2 = _Method; } R operator()(int v1, int v2) { return (*this->Object.*this->Method2)(v1, v2); } private: T* Object; union { R (T::* Method1)(); R (T::* Method2)(int, int); }; };Das funktioniert, und vorgestellt hatte ich mir sowas:
template<class T, class R, class P1 = void> class MethodPtr { public: MethodPtr(T* _Object, R (T::* _Method)()) { this->Object = _Object; this->Method1 = _Method; } R operator()() { return (*this->Object.*this->Method1)(); } MethodPtr(T* _Object, R (T::* _Method)(P1, P1)) { this->Object = _Object; this->Method2 = _Method; } R operator()(P1 v1, P1 v2) { return (*this->Object.*this->Method2)(v1, v2); } private: T* Object; union { R (T::* Method1)(); R (T::* Method2)(P1, P1); }; };Also einfach aus allem, was vorher int war, da habe ich P1 gemacht und einen dritten Template-Parameter hinzugefügt.
Leider lässt sich das ganze so nicht kompilieren, ich bekomme die Meldung: "invalid parameter type 'void'".
Geht das überhaupt? Und wenn ja, wie?
Vielen Dank schonmal.
-
void ist als Variablen Typ unzulässig.
Du könntest ihn durch z.b. ein struct nulltype ersetzen,
oder einfach einen standard Parameter vorgeben (int z.b.)
-
class NullType{}; template<class T, class R, class P1 = NullType> class MethodPtr { //... };
-
Du solltest mal nach "Funktoren" googeln. Oder dir die 'sigc' Bibliothek anschauen.
-
oh jo, da hab' ich wohl einfach nur gepennt.

Vielen Dank. Kann von mir aus gelöscht werden.
