2010-11-15 10 views
7

Hallo Ich habe eine Funktion, die UnterschriftGibt es eine Möglichkeit std aufrufen :: Transformation mit einer Funktion mit mehreren Argumenten

std :: string f (double x, double param1, param2 Doppel, Doppel param3) ist;

Ich möchte es auf einem std :: vector xvalues ​​für den Parameter x mit etwas wie std :: transform für einen bestimmten Wert von param1, param2 und param3 aufrufen.

Es wäre das Äquivalent von:

double param1(1.); 
double param2(1.1); 
double param3(1.2); 
std::vector<std::string> results(); 
for (std::vector<double>::const_iterator it = xvalues.begin() ; it != xvalues.end() ; ++xvalues) 
{ 
    results.push_back(f(*it, param1, param2, param3); 
} 

Wie dies in eine elegantere Art und Weise getan werden?

Mit freundlichen Grüßen Tony

Antwort

16

Sie sollten boost::bind aussehen, in die Sie ermöglicht, wie der Name schon sagt, zu 'binden' Argumente an Ihre Funktion f:

std::transform([...], boost::bind(&f, _1, param1, param2, param3)); 

Das Ergebnis dieser bind ist eine unäre Funktion (_1 ist ein Platzhalter für das Argument, mit dem es aufgerufen werden sollte): Alle anderen Parameter haben feste Werte param1, param2, param3.

3

Als icecrime vorgeschlagen boost::bind wird hier die beste Option sein. Wenn Sie jedoch nicht boost aus irgendeinem Grund können Sie tun können, ist es immer mit benutzerdefinierten Funktors wie folgt aus:

using namespace std; 

string f(double x, double param1, double param2, double param3) 
{ 
    return string(); 
} 

struct Caller 
{ 
    Caller(vector<string>& results) : m_res(results) 
    { 

    } 
    void operator()(double x) 
    { 
     m_res.push_back(f(x, 1.0,2.0,3.0)); 
    } 

private: 
    vector<string>& m_res; 
}; 

int main() 
{ 
    vector<double> d; 
    vector<string> r; 

    d.push_back(1.0); 
    d.push_back(2.0); 

    Caller c(r); 
    for_each(d.begin(), d.end(), c); 

} 
7

Und der Vollständigkeit halber, die C++ 0x-Version, oder was ist die ganze Aufregung über lambdas?

std::transform([...], [=](double i){ return f(i, param1, param2, param3); }); 
+1

merkwürdigerweise kannte ich dieses eine wie es in vielen neuen Artikeln war. – BlueTrin

Verwandte Themen