2009-06-15 29 views
15

Hãy xem xét ví dụ sau.boost :: bind and class member function

#include <iostream> 
#include <algorithm> 
#include <vector> 

#include <boost/bind.hpp> 

void 
func(int e, int x) { 
    std::cerr << "x is " << x << std::endl; 
    std::cerr << "e is " << e << std::endl; 
} 

struct foo { 
    std::vector<int> v; 

    void calc(int x) { 
     std::for_each(v.begin(), v.end(), 
      boost::bind(func, _1, x)); 
    } 

    void func2(int e, int x) { 
     std::cerr << "x is " << x << std::endl; 
     std::cerr << "e is " << e << std::endl; 
    } 

}; 

int 
main() 
{ 
    foo f; 

    f.v.push_back(1); 
    f.v.push_back(2); 
    f.v.push_back(3); 
    f.v.push_back(4); 

    f.calc(1); 

    return 0; 
} 

Tất cả đều hoạt động tốt nếu tôi sử dụng chức năng func(). Nhưng trong ứng dụng thực tế, tôi phải sử dụng chức năng của thành viên lớp học, ví dụ: foo::func2() trong ví dụ này. Làm thế nào tôi có thể làm điều này với boost :: bind?

Trả lời

18

Bạn đã thực sự, thực sự gần gũi:

void calc(int x) { 
    std::for_each(v.begin(), v.end(), 
     boost::bind(&foo::func2, this, _1, x)); 
} 

EDIT: oops, do đó I. heh.

Mặc dù, trên phản ánh, không có gì thực sự sai với ví dụ làm việc đầu tiên của bạn. Bạn thực sự nên ưu tiên các chức năng miễn phí trên các chức năng của thành viên nếu có thể - bạn có thể thấy sự đơn giản tăng lên trong phiên bản của mình.

+0

Điều này được cho là hoạt động với tăng :: lamba :: bind. Tôi không sử dụng boost :: bind nhiều. –

1

Trong khi sử dụng boost :: bind cho các hàm thành viên của lớp ràng buộc, đối số thứ hai phải cung cấp ngữ cảnh đối tượng. Vì vậy, mã của bạn sẽ hoạt động khi đối số thứ hai là this

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