2010-11-22 42 views
6

Gần đây tôi đã quyết định thay đổi vectơ con trỏ thành vectơ con trỏ thông minh, nhưng mặc dù những con trỏ thông minh này tương thích STL, tôi không thể chuyển đổi một số thuật toán để sử dụng chúng .sử dụng mem_fun() cho vùng chứa con trỏ thông minh

Xem xét một

class Base 
{ 
    ... 
    virtual bool valid(); 
}; 

Làm thế nào để bạn chuyển đổi

bool is_any_valid(vector< Base* > v) 
{ 
    return v.end() != 
     find_if(v.begin(), v.end(), mem_fun(&Base::valid)); 
} 

vào điều này?

bool is_any_valid(vector< my_smart_ptr<Base> v) 
{ 
    // mem_fun() fails, because valid() is not a member of my_smart_ptr<Base> !!! 
    // return v.end() != 
    // find_if(v.begin(), v.end(), mem_fun(&Base::valid)); 
} 

Bạn có thể giả định rằng my_smart_pointer <> có cơ bản giao diện tương tự như shared_ptr <>, nhưng tôi không thể sử dụng tăng trong dự án của tôi.

Có bộ điều hợp (chung) tôi có thể viết để cho phép mem_fun hoặc mem_fun_ref hoạt động không? Tôi tốt nhất là tìm một giải pháp nội tuyến, như:

find_if(v.begin(), v.end(), mem_fun(some_adapter(&Base::valid))); 

vì có nhiều lần xuất hiện tương tự như vậy.

Trả lời

4

Bạn muốn sử dụng boost mem_fn, vì nó thực hiện chính xác những gì bạn muốn. Nhìn vào liên kết này, cụ thể là phần MỤC ĐÍCH.

http://www.boost.org/doc/libs/1_45_0/libs/bind/mem_fn.html

BTW, bạn nên đi qua một tham chiếu đến const, và không phải là toàn bộ vector trong is_any_valid (và giá trị của bạn() nên được const cũng).

+0

'mem_fn' cũng có sẵn trong MSVC++, http://msdn.microsoft.com/en-us/library/bb982851.aspx –

+0

có, chính xác những gì tôi cần. Chỉ (sau khi đọc mã) Tôi không thể hiểu tại sao họ cũng không thực hiện tham chiếu đến một trường hợp không phải là const! –

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