2009-08-26 10 views
5

In der Vergangenheit habe ich die Funktionen bind1st und bind2nd verwendet, um direkte Operationen mit STL-Containern auszuführen. Ich habe jetzt einen Container von MyBase Klasse Zeiger, die die folgenden für simplicities willen sind:Verwenden von STL zum Binden mehrerer Funktionsargumente

 
class X 
{ 
public: 
    std::string getName() const; 
}; 

Ich möchte rufen Sie die folgende statische Funktion for_each und Bindung sowohl die 1. und 2. Parameter als solche:

StaticFuncClass :: doSomething (ptr-> getName(), funcReturningString());

Wie würde ich for_each verwenden und beide Parameter dieser Funktion binden?

Ich suche nach etwas entlang der Linien von:

 
for_each(ctr.begin(), ctr.end(), 
     bind2Args(StaticFuncClass::doSomething(), 
        mem_fun(&X::getName), 
        funcReturningString()); 

Ich sehe Erhöhung eine bind Funktion seiner eigenen bietet, die wie etwas aussieht, die hier von Nutzen sein würde, aber was ist die STL-Lösung?

Vielen Dank im Voraus für Ihre Antworten.

+0

Nur klar zu sein, für jedes Element 'e' in die Sequenz, die Sie aufrufen möchten 'StaticFuncClass :: doSomething (e.getName(), funcReturningString())'? – jalf

+0

ja ... technisch wäre es e-> getName() weil die Elemente im Container Zeiger sind. –

Antwort

13

Eine zuverlässige Notlösung, wenn die bind-Syntax ist zu seltsam bekommt Ihr eigenes Funktors zu definieren:

struct callDoSomething { 
    void operator()(const X* x){ 
    StaticFuncClass::doSomething(x->getName(), funcReturningString()); 
    } 
}; 

for_each(ctr.begin(), ctr.end(), callDoSomething()); 

Dies ist mehr oder weniger, was die bind Funktionen hinter den Kulissen tun sowieso.

+0

+1 Ja, darüber hatte ich auch nachgedacht. Ich habe mich nur gefragt, ob es einen Inline-Weg gibt, wie man nur 1 von 2 mit bind1st oder bind2nd bindet. –

+0

Kein Bedarf für einen Konstruktor. – xtofl

+1

Es könnte mit den STL-Bind-Funktionen möglich sein, aber es wird ein bisschen zu haarig für mich. Ich würde den Funktor-Ansatz bevorzugen. Natürlich in C++ 0x können Sie es inline mit einem Lambda definieren – jalf

4

Die "STL-Lösung" wäre, einen eigenen Binder zu schreiben ... deshalb haben sie den mächtigen boost :: bind geschaffen.

+2

Powerfool? : p – jalf

+0

eh eh :) behoben! – UncleZeiv

3

können Sie entweder erstellen eine lokale Funktors Struktur, die durch den Compiler inlined werden kann (wie JALF gezeigt), oder verwenden Sie eine einfache Funktion:

void myFunc(const X* x) { 
    StaticFuncClass::doSomething(x->getName(), funcrReturningString()); 
} 

for_each(c.begin(), c.end(), myFunc); 
+1

das & sollte nicht notwendig sein. Funktionen können implizit in Funktionszeiger umgewandelt werden, so dass nur 'myFunc' funktionieren würde. – jalf

+0

Sie haben Recht. Es ist nicht notwendig. Schlechte Angewohnheit, fürchte ich. – xtofl

Verwandte Themen