bind2nd und mem_fun_ref
-
hi!
ich bin noch recht neu im c++ geschäft. kürzlich habe ich auf einer website folgenden code entdeckt:
--------------------------
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;struct A
{
void Print(const char* header) const
{
cout << header << endl;
}
};int main()
{
vector<A> objCont(2,A());
for_each(objCont.begin(), objCont.end(), bind2nd(mem_fun_ref(&A::Print), "irgendwas "));
}
--------------------------mein problem ist nun folgendes: der konstruktor von mem_fun_ref wird aufgerufen, wonach das erste argument von bind2nd eine funktion bzw hier ein funktor ist. im verlaufe der for_each ausführung wird bind2nd mit einem objekt als argument ausgeführt. bind2nd ruft dann wiederum mem_fun_ref mit dem objekt und wie _ich_ verstanden habe, mit dem zweiten argument "irgendwas " auf. Natürlich kann dies so nicht passieren, da mem_fun_ref nur ein argument akzeptiert. stattdessen wird mem_fun_ref nur mit dem objekt als argument ausgeführt und schließlich die funktion Print mit dem string "irgendwas " aufgerufen.
trotz intensivsten nachdenkens ist mir nicht klar, wieso dies funktioniert und der compiler keinen fehler meldet. bind2nd müsste doch versuchen, sowohl das objekt als auch das "irgendwas " mem_fun_ref als argumente mitzugeben.danke für die hilfe
-
soweit ich weiß baut dir mem_fun_ref einen Funktor zu der Funktion. Im Deinem Fall operator()(const char*). bind2nd baut darum herum einen funktor, der den ersten (den von mem_fun_ref) mit dem zu bindenden Argument aufruft.
-
Fast richtig: mem_fun_ref() liefert dir einen op()(T*,const char*), der wiederum die übergebene Memberfunktion aufruft - bind2nd() setzt den zweiten Parameter dieses Funktors fest auf den Wert "irgendwas ".
(und for_each ruft die übergebene Funktion mit jedem Element des übergebenen Bereiches auf - durch die ganzen Zwischenschritte rufst du also für jedes Objekt des Containers die Memberfunktion "Print("irgendwas ");" auf)