2017-12-07 8 views
0

Ich würde gerne wissen, warum fun1() als statische Member-Funktion machen müssen? Funktionszeiger in der Vorlage? im unteren Teil des Codes.Verstehen über Vorlagen und Funktionszeiger

#include<iostream> 
using namespace std; 
class A 
{ 
    int temp; 
    public: 
    A():temp(1){} 
    template<class T, void (*fn)(T*)> 
    static void create(T *ptr) 
    { 
     cout <<"create fn"<<endl; 
     //fun1(ptr); 
    } 
    static void fun1(A* tp) 
    { 
     cout<<"func temp"<<endl; 
    } 
    static void fun2(A& ob) 
    { 
     cout<<"fun2 start"<<endl; 
     A::create<A,&A::fun1>(&ob); 
     cout<<"fun2 end"<<endl; 
    } 
}; 
int main() 
{ 
    A ob,ob1; 
    ob.fun2(ob1); 
} 
+1

siehe [static member] (http://en.cppreference.com/w/cpp/language/static) und siehe [Zeiger auf Funktion] (http://de.cppreference.com/w/cpp/language/pointer#Pointers_to_functions) – Oliv

Antwort

2

Eine statische Funktion Mitglied einer Klasse ist einfach eine reguläre Funktion in der Namespace-Klasse:

Statische Elemente einer Klasse sind nicht mit den Objekten der Klasse zugeordnet sind: sie sind unabhängig Objekte mit statischer Speicherdauer oder reguläre Funktionen, die im Namensraumbereich definiert sind, nur einmal im Programm.

cppreference.com

In Ihrem Beispiel wäre die Art von A::f1void(A*) sein und die Art der A::f2 würde void(A&) sein. Insbesondere müssen statische Funktionen keine Instanz aufrufen.

Alternativ erfordern die nicht statischen Elementfunktionen do, dass eine Instanz aufgerufen werden muss. Sie müssten pointers to class members verwenden. In Ihrem Beispiel würden Sie &A::f1 und &A::f2 verwenden und ihre Typen wären (void)A::*f1(A*) bzw. (void)A::*f2(A&). Wenn Zeiger auf Elementfunktionen wie normale Funktionszeiger behandelt würden, wie würden sie heißen? Sie benötigen eine Objektinstanz, auf die der Zeiger this zeigen kann.

Sie einen Zeiger auf eine Member-Funktion auf ein Objekt umwandeln kann, der den () Operator und verhält sich wie eine Funktion (auch bekannt als ein functor) mit std Überlastungen :: bind:

A a; 
std::bind(&A::f1, &a); // &a is the value of this 

jedoch functors nicht haben derselbe Typ wie Funktionszeiger. Ich empfehle std::function in der functional Header-Datei anstelle von Funktionszeigern, weil sie für Funktoren Platz bieten.

(Siehe http://en.cppreference.com/w/cpp/language/pointer für weitere Informationen).

+1

'std :: bind' erstellt keinen Funktionszeiger, er erzeugt ein Objekt vom Typ class, das wie eine Funktion aufgerufen werden kann. Auch Lambdas sind in mehrfacher Hinsicht "std :: bind" überlegen. – aschepler

+0

Huh, danke, dass du es mir erzählt hast. Liefern Lambdas aber auch keine Funktoren? –