Könnte nicht find_if
nur eine Überladung von sein find
? So std::binary_search
machen es Freunde...
Lösung des Problems
Ein Prädikat ist eine gültige Sache, die gefunden werden muss, sodass Sie zu Mehrdeutigkeiten gelangen könnten.
Betrachten find_if
wird umbenannt find
, dann haben Sie:
template <typename InputIterator, typename T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
template <typename InputIterator, typename Predicate>
InputIterator find(InputIterator first, InputIterator last, Predicate pred);
Was also tun mit:
find(c.begin(), c.end(), x); // am I finding x, or using x to find?
Anstatt zu versuchen, eine komplizierte Lösung zur Unterscheidung zu x
finden (was nicht immer möglich ist *), ist es einfacher, sie einfach zu trennen.
*Dies wäre zweideutig, unabhängig davon, was Ihr Schema ist oder wie mächtig es sein könnte†:
struct foo
{
template <typename T>
bool operator()(const T&);
};
bool operator==(const foo&, const foo&);
std::vector<foo> v = /*... */;
foo f = /*... */;
// f can be used both as a value and as a predicate
find(v.begin(), v.end(), f);
†Gedankenlesen aufsparen.
Keine Kommentare:
Kommentar veröffentlichen