ist es möglich, wie folgt aus:C++ Zeiger auf Elementfunktion als Vorlage Standard Argument
template< typename C,
typename R,
typename A,
typename F=R (C::*)(A) >
class MemberFuncPtr { ...
ist es möglich, wie folgt aus:C++ Zeiger auf Elementfunktion als Vorlage Standard Argument
template< typename C,
typename R,
typename A,
typename F=R (C::*)(A) >
class MemberFuncPtr { ...
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.
typedef
wird Ihren Code benutzerfreundlicher machen. Nur typedef
Zeiger auf Funktion, dann verwenden Sie es als andere Arten.
Ich dachte, typedef ist nicht für die Erklärung der Vorlage Argumente –
Wie schreibe ich Typedef für Vorlagenvorlagen? (ok sad_man hat schon geantwortet, es ist nicht möglich) – uray
typedef R (C :: func *) (A); Verwenden Sie dann func als Vorlagenargument. –
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;
Nicht kompilieren - 'CWrapper' wissen nichts über' R' und 'A' –
Ja, es ist absolut gültig.
class X {
public:
void Y() {
}
};
int main() {
MemberFuncPtr<X, void, void> func;
}
Build erfolgreich.
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.
Ich denke, der Link ist kaputt. –
Scheint, dass ganze ideone.com derzeit down ist. –
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 –
@Pawel Zubrycki: Ja, ich habe vergessen, das Haupt(), aber Ihre Version ist mit was, 3 Zeilen offensichtlichen, nicht-magische Code verbessert? Komm schon .... –
Deshalb habe ich es wenig genannt. –