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


Anmelden zum Antworten