2009-06-25 38 views
11

Tôi có bộ giảm thiểu chức năng một chiều. Ngay bây giờ tôi đang đi qua nó con trỏ chức năng. Tuy nhiên nhiều chức năng có nhiều tham số, một số được giữ cố định. Tôi đã triển khai điều này bằng cách sử dụng các functors như vậyLàm thế nào để bạn vượt qua tăng :: ràng buộc đối tượng với một chức năng?

template <class T> 
minimize(T &f) { 
} 

Functor f(param1, param2); 
minimize<Functor>(f); 

Tuy nhiên định nghĩa functor có nhiều lỗi. Boost :: bind trông sạch hơn. Vì vậy mà tôi có thể làm:

minimize(boost:bind(f,_1,param1,param2)) 

Tuy nhiên tôi không rõ ràng những gì tuyên bố minimize của tôi nên thích như sử dụng boost::bind. Loại đối tượng là boost::bind? Có một mô hình dễ dàng cho việc này mà tránh các boilerplate của functors nhưng cho phép nhiều tham số ràng buộc?

Trả lời

17

Bạn chỉ có thể sử dụng boost::function. Tôi nghĩ rằng boost::bind không có kiểu trả về của riêng nó, nhưng điều đó tương thích với boost::function. sử dụng điển hình là làm cho một typedef cho hàm:

typedef boost::function<bool(std::string)> MyTestFunction; 

và sau đó bạn có thể vượt qua bất kỳ chức năng tương thích với boost::bind:

bool SomeFunction(int i, std::string s) { return true; } 
MyTestFunction f = boost::bind(SomeFunction, 42, _1); 
f("and then call it."); 

Tôi hy vọng đó là những gì bạn muốn.

Nó cũng hoạt động với các phương pháp bằng cách chuyển con trỏ this cho cuộc gọi dưới dạng tham số thứ hai tới boost::bind.

4

tôi sẽ xác định hạn chế tối đa() theo cách này:

minimize(boost::function< return_type(param_type1,param_type2,param_type3,...)> f) 
{ 
    ... 
} 

Sau đó, bạn có thể gọi giảm thiểu() như thế này:

minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...)); 
3

Thay đổi các tham số để một tham số giá trị. Các đối tượng chức năng có trọng lượng nhẹ cố ý, và chắc chắn là boost::bind, được chế tạo đặc biệt để vừa với không gian trong một vài byte bằng cách sử dụng boost::compressed_pair và những gì không.

template <class T> 
void minimize(T f) { 
} 

Sau đó, bạn có thể chuyển kết quả của boost::bind. Hãy nhớ rằng boost::bind thực sự là một mẫu chức năng trả về một số đối tượng của một số loại. Vì vậy, có minimize có tham số tham chiếu không const không thể hoạt động.

1

Trước tiên, bạn đang lấy đối số mẫu của mình dưới dạng ref-to-non-const, do đó việc tạm thời returend bằng cách tăng :: bind sẽ không liên kết với nó. Vì vậy, bạn có thể sử dụng nó như:

template <class T> 
T::result_type minimize(const T &f) { 
} 

Nhưng nếu bạn muốn sử dụng điều này với functors của bạn là tốt, họ sẽ cần phải có một nhà điều hành const(). Vì vậy, có lẽ bởi giá trị tốt hơn:

template <class T> 
T::result_type minimize(T f) { 
} 

Tôi tin rằng có sự trở lại được T :: RESULT_TYPE sẽ buộc một T trở thành một tăng :: chức năng (chứ không phải là lợi nhuận kiểu ràng buộc phức tạp), nhưng tôi không 100%

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