2010-12-15 8 views

Antwort

1

Eigentlich machen, scheint es ziemlich richtig zu mir, ich Erhalte keine Fehler für dieses Codeelement:

template< typename C, 
      typename R, 
      typename A, 
      typename F=R (C::*)(A) > 
class MemberFuncPtr 
{ 
     C & Cmember; 
     F f; 
public: 
     MemberFuncPtr(C & c, F func):Cmember(c), f(func) {} 
     R DoIt(A & a) 
     { 
       return (Cmember.*f)(a); 
     } 
}; 
class classA 
{ 
public: 
     int toInt(double aa) 
     { 
       return int(aa); 
     } 
}; 
int main() 
{ 
     classA aInstance; 
     MemberFuncPtr<classA,int,double> xx(aInstance,&classA::toInt); 
     return 0; 
} 

Sie können den Code here beobachten.

+0

Eigentlich muss in C++ main() Ganzzahl zurückgeben, so dass Ihr Code nicht genau mit Standard gültig ist. Darüber hinaus muss das Argument von MemberFuncPtr :: DoIt Lvalue sein, was wenig Schmerz sein kann. Meine kleine verbesserte Version: http://ideone.com/gA7kJ –

+0

@Pawel Zubrycki: Ja, ich habe vergessen, das Haupt(), aber Ihre Version ist mit was, 3 Zeilen offensichtlichen, nicht-magische Code verbessert? Komm schon .... –

+0

Deshalb habe ich es wenig genannt. –

0

typedef wird Ihren Code benutzerfreundlicher machen. Nur typedef Zeiger auf Funktion, dann verwenden Sie es als andere Arten.

+1

Ich dachte, typedef ist nicht für die Erklärung der Vorlage Argumente –

+0

Wie schreibe ich Typedef für Vorlagenvorlagen? (ok sad_man hat schon geantwortet, es ist nicht möglich) – uray

+0

typedef R (C :: func *) (A); Verwenden Sie dann func als Vorlagenargument. –

0

Zuerst können Sie Template-Wrapper schreiben:

template < typename C > 
class CWrapper 
{ 
typedef R(C::func*)(A); 
C* realC; 
Cwrapper(C* c):realC(c){} 
}; 

dann schreiben Sie Klasse auf diese Weise:

template < typename C, 
      typename R, 
      typename F = C::func > 
class MemberFuncPtr{... 

dann MemberFuncPtr< CWrapper <C>, R> memFuncPtr;

+1

Nicht kompilieren - 'CWrapper' wissen nichts über' R' und 'A' –

3

Ja, es ist absolut gültig.

class X { 
public: 
    void Y() { 
    } 
}; 

int main() { 
    MemberFuncPtr<X, void, void> func; 
} 

Build erfolgreich.

0

Sad_man Code mit einigen C++ 0x Magie Korrigiert: http://ideone.com/rng6V (wahrscheinlich nicht gonna Arbeit für Sie, da nicht viele Compiler C++ 0x hat: - |)

Arbeiten mit rvalues ​​und es wird beispielsweise, wie man mit Lambda-Funktionen erreichen, was Sie wollen.

+0

Ich denke, der Link ist kaputt. –

+0

Scheint, dass ganze ideone.com derzeit down ist. –

Verwandte Themen