2010-11-15 29 views
7

Xin chào tôi có một hàm có chữ ký làCó cách nào để gọi std :: transform với một hàm có nhiều đối số

std :: chuỗi f (double x, double param1, double param2, double param3);

Tôi muốn gọi nó trên một std :: vector xvalues ​​cho tham số x sử dụng một cái gì đó như std :: transform cho một giá trị cụ thể của param1, param2 và param3.

Nó sẽ là tương đương với:

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

Làm thế nào điều này có thể được thực hiện một cách thanh lịch hơn?

Kind coi Tony

Trả lời

16

Bạn nên nhìn vào boost::bind mà sẽ cho phép bạn, như tên cho thấy, để 'ràng buộc' đối số cho hàm của bạn f:

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

Kết quả của việc ràng buộc này là chức năng đơn nhất (_1 là trình giữ chỗ cho đối số được gọi với): tất cả các thông số khác sẽ có giá trị cố định param1, param2, param3.

3

Vì icecrime đề xuất boost::bind sẽ là tùy chọn tốt nhất ở đây. Tuy nhiên, nếu bạn không thể sử dụng boost vì một lý do bạn luôn có thể làm điều đó với người dùng functor định nghĩa như thế này:

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

Và cho đầy đủ sake, phiên bản C++ 0x hoặc tất cả các fuss là những gì về lambdas?

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

kỳ lạ đủ, tôi biết điều này giống như trong nhiều bài viết gần đây. – BlueTrin

Các vấn đề liên quan