2015-05-07 28 views
7

Ich habe Probleme herauszufinden, den Unterschied zwischen den beiden Funktionen wrappers std::function und std::mem_fn. Aus der Beschreibung scheint mir, dass std :: function tut alles std::mem_fn tut und mehr. In welchem ​​Fall würde man std::mem_fn über std::function verwenden?Was ist der Unterschied zwischen std :: function und std :: mem_fn

+2

Meinst du 'std :: function' vs. den Rückgabetyp von' std :: mem_fn'? Der Vergleich einer Klassenvorlage mit einer Funktionsvorlage macht mir wenig Sinn. – chris

Antwort

19

Sie können std::function mit std::mem_fn nicht wirklich vergleichen. Die erste ist eine Klassenvorlage, deren Typ Sie angeben, und die zweite ist eine Funktionsvorlage mit einem nicht angegebenen Rückgabetyp. Es gibt wirklich keine Situation, in der Sie tatsächlich einen gegen den anderen betrachten würden. Ein besserer Vergleich könnte zwischen mem_fn und std::bind liegen. Dort wird mem_fn für den spezifischen Anwendungsfall eines pointer-to-member viel weniger ausführlich, wenn Sie nur alle Argumente durchlaufen möchten. Aufgrund dieser einfachen Art:

struct A { 
    int x; 
    int getX() { return x; } 
    int add(int y) { return x+y; } 
}; 

A a{2}; 

Wie würden Sie einen Funktor machen, die gerade getX() auf einem bestimmten A nennt?

auto get1 = std::mem_fn(&A::getX); 
auto get2 = std::bind(&A::getX, _1); 

get1(a); // yields 2 
get2(a); // same 

Und nimmt ein zusätzliches Argument für add?

auto add1 = std::mem_fn(&A::add); 
auto add2 = std::bind(&A::add, _1, _2); 

add1(a, 5); // yields 7 
add2(a, 5); // same 

So ist mem_fn prägnante in diesem Fall. Wenn wir jedoch ein bestimmtes Argument, sagen wir rufen add(5) auf einem bestimmten A, man kann nur das tun, mit bind binden wollte:

auto add_5 = std::bind(&A::add, _1, 5); 
add_5(a); // yields 7 

Letztlich kein Vergleich zwischen function und mem_fn, aber es gibt Zeiten mem_fn bevorzugen zu bind.

9

Das von std::mem_fn zurückgegebene Wrapper ist extrem leicht; Es ist ein dünner Wrapper um einen Zeiger auf ein Mitglied.

std::function verwendet Typ löschen, die viel schwerer ist.

Verwandte Themen