2015-05-19 8 views

risposta

11

Questi algoritmi forniscono una versione denominata anziché una in overload perché entrambe le versioni dell'algoritmo hanno lo stesso numero di argomenti. Sarebbe quindi possibile sovraccaricare le ambiguità.

Per evitare possibili ambiguità, la libreria fornisce versioni con nome separato per tali algoritmi, find_if è uno di quelli.

+3

"raro"? Senza un trucco di SFINAE, sarebbero sempre indistinguibili dalla risoluzione del sovraccarico. –

18

Non è chiaro come la risoluzione del sovraccarico funzioni genericamente. Cosa succede se, ad esempio, il contenitore contiene predicati?

Questa potenziale ambiguità viene evitata avendo funzioni con nomi diversi, ogni nome esprime più chiaramente l'intento.

Si noti che questa è una semplificazione: non è richiesto in std::find che l'oggetto di riferimento sia dello stesso tipo di quello value_type del contenitore, solo che siano confrontabili per l'uguaglianza. I requisiti per il predicato in std::find_if sono genericamente simili. Entrambe queste funzioni sono estremamente generiche, il che significa che un'ambiguità potrebbe presentarsi più facilmente rispetto all'esempio fornito. Ad esempio,

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. 
} 
Problemi correlati