2010-11-15 8 views
7

Hola tengo una función que es la firma¿Hay una manera de llamar std :: transformar con una función con múltiples argumentos

std :: string f (x dobles, dobles param1, doble param2, doble param3);

Me gustaría llamarlo a std :: vector xvalues ​​para el parámetro x usando algo como std :: transform para un valor particular de param1, param2 y param3.

Sería el equivalente a:

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); 
} 

¿Cómo se puede hacer esto de una manera más elegante?

Saludos cordiales , Tony

Respuesta

16

Usted debe mirar en boost::bind que le permitirá, como su nombre indica, a los argumentos de 'Ata' a su función f:

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

El resultado de esta vinculación se una función única (_1 siendo un marcador de posición para el argumento con el que debe invocarse): todos los demás parámetros tendrán valores fijos param1, param2, param3.

3

Como icecrime sugirió boost::bind será la mejor opción aquí. Sin embargo, si no se puede utilizar boost por alguna razón, siempre se puede hacer con funtor definida por el usuario como esto:

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

Y en aras de la exhaustividad, la versión C++ 0x, o ¿Qué es todo el alboroto acerca de lambdas?

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

por extraño que parezca, ya lo conocía como lo era en muchos artículos recientes. – BlueTrin

Cuestiones relacionadas