2010-11-15 91 views
7

你好,我有一个函数,签名是有没有办法来调用的std ::与多个参数

的std :: string F(双X,双参数1,双参数2,双参数3)功能变换

我想在参数x的std :: vector xvalues中使用类似std :: transform的参数来调用param1,param2和param3的特定值。

这将是等价的:

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

如何能在这一个更优雅的方式进行?

亲切的问候 托尼

回答

16

你应该看看boost::bind这将使你,顾名思义,以“绑定”参数的功能f

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

这个绑定的结果是一元函数(_1是它应该被调用的参数的占位符):所有其他参数将具有固定值param1,param2,param3

3

由于icecrime建议boost::bind将是这里最好的选择。但是,如果你不能因为某些原因使用boost你可以随时使用用户定义的函子做这样的:

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

并为完整起见,在的C++ 0x版本,或有什么大惊小怪关于lambdas

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

奇怪的是,我知道这个,因为它是在许多最近的文章。 – BlueTrin 2010-11-15 13:36:35

相关问题