#include <algorithm>
#include <vector>
struct Student {
int get_average() const {
return 42;
}
};
struct CompAverage
{
bool operator () (const Student & a, const Student & b) const
{
return a.get_average() < b.get_average();
}
};
using Student_IT = std::vector<Student>::const_iterator;
Student dispatch(const std::vector<Student> &all_students, Student_IT (*f)(Student_IT, Student_IT, CompAverage))
{
return *f(std::begin(all_students), std::end(all_students), CompAverage{});
}
int main()
{
std::vector<Student> v(42);
dispatch(v, &std::min_element);
dispatch(v, &std::max_element);
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KCgpzdHJ1Y3QgU3R1ZGVudCB7CiAgICBpbnQgZ2V0X2F2ZXJhZ2UoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIDQyOwogICAgfQp9OwoKc3RydWN0IENvbXBBdmVyYWdlCnsKICAgIGJvb2wgb3BlcmF0b3IgKCkgKGNvbnN0IFN0dWRlbnQgJiBhLCBjb25zdCBTdHVkZW50ICYgYikgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gYS5nZXRfYXZlcmFnZSgpIDwgYi5nZXRfYXZlcmFnZSgpOwogICAgfQp9OwoKdXNpbmcgU3R1ZGVudF9JVCA9IHN0ZDo6dmVjdG9yPFN0dWRlbnQ+Ojpjb25zdF9pdGVyYXRvcjsKClN0dWRlbnQgZGlzcGF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8U3R1ZGVudD4gJmFsbF9zdHVkZW50cywgU3R1ZGVudF9JVCAoKmYpKFN0dWRlbnRfSVQsIFN0dWRlbnRfSVQsIENvbXBBdmVyYWdlKSkKewogICAgcmV0dXJuICpmKHN0ZDo6YmVnaW4oYWxsX3N0dWRlbnRzKSwgc3RkOjplbmQoYWxsX3N0dWRlbnRzKSwgQ29tcEF2ZXJhZ2V7fSk7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjp2ZWN0b3I8U3R1ZGVudD4gdig0Mik7CgogICAgZGlzcGF0Y2godiwgJnN0ZDo6bWluX2VsZW1lbnQpOwogICAgZGlzcGF0Y2godiwgJnN0ZDo6bWF4X2VsZW1lbnQpOwogICAgcmV0dXJuIDA7Cn0K