Это работает для меня:
template <typename It, typename Pred,
typename Comp = std::less<decltype(*std::declval<It>())>>
It minElementWhere(
It begin,
It end,
Pred pred = Pred(),
Comp comp = Comp()
) {
It minElement = end;
for (It it = begin; it != end; ++it) {
if (!pred(*it)) {
continue;
}
if (comp(*it, *minElement)) {
minElement = it;
}
}
return minElement;
}