2015-05-19 14 views

Trả lời

11

Các thuật toán này cung cấp phiên bản được đặt tên thay vì phiên bản đã quá tải vì cả hai phiên bản của thuật toán đều có cùng số đối số. Do đó, sự mập mờ quá tải có thể xảy ra.

Để tránh bất kỳ sự mơ hồ nào có thể xảy ra, thư viện cung cấp các phiên bản được đặt tên riêng cho các thuật toán đó, find_if là một trong số đó.

+3

"hiếm"? Nếu không có một số mẹo SFINAE họ sẽ không thể phân biệt bởi quá tải độ phân giải tất cả các thời gian. –

18

Không rõ độ phân giải quá tải sẽ hoạt động như thế nào. Điều gì nếu, nói, container chứa các vị từ?

struct pred 
{ 
    bool operator()(const pred&) const; 
    friend bool operator==(const pred&,const pred&); 
}; 

std::vector<pred> v; 
pred p; 
std::find(v.begin(), v.end(), p); // what should happen here? 

Khả năng mơ hồ này có thể tránh được khi có chức năng với tên gọi khác nhau, mỗi tên thể hiện ý định rõ ràng hơn.

Lưu ý rằng đây là sự đơn giản hóa: không có yêu cầu trong std::find rằng đối tượng tham chiếu có cùng loại với value_type của vùng chứa, chỉ là chúng có thể so sánh được với sự bình đẳng. Các yêu cầu đối với biến vị ngữ trong std::find_if tương tự nhau. Cả hai hàm này đều cực kỳ chung chung, có nghĩa là một sự mơ hồ có thể phát sinh dễ dàng hơn trong ví dụ đã cho. Ví dụ:

struct foo {}; 

struct pred 
{ 
    bool operator()(const foo&) const; 
}; 

bool operator==(const foo&, const pred&); 

int main() 
{ 
    std::vector<foo> v; 
    pred p; 
    std::find(v.begin(), v.end(), p); // What should this do? 
    std::find_if(v.begin(), v.end(), p); // Here, it is clear. 
} 
Các vấn đề liên quan