История изменений
Исправление i-rinat, (текущая версия) :
Я думаю, это можно через std::function сделать.
С std::function делать нет смысла. Разве что если C++14 нет.
Покажи код.
#include <algorithm>
#include <iostream>
#include <vector>
struct Data {
size_t number;
char letter;
};
template <class ForwardIterator, class DataType, typename KeyType>
ForwardIterator max_by_key(ForwardIterator first, ForwardIterator last,
KeyType (*get_key)(DataType &)) {
auto cmp = [get_key](DataType const &a, DataType const &b) {
return get_key(a) < get_key(b);
};
return std::max_element(first, last, cmp);
}
int main() {
std::vector<Data> numbers{
{1, 'a'}, {2, 'b'}, {4, 'd'}, {3, 'c'},
};
#if 1
// Работает.
size_t (*getter)(Data const &a) = [](Data const &a) { return a.number; };
std::cout << max_by_key(numbers.begin(), numbers.end(), getter)->letter
<< "\n";
#else
// Не работает.
std::cout << max_by_key(numbers.begin(), numbers.end(),
[](Data const &a) { return a.number; })
->letter
<< "\n";
#endif
}
Исходная версия i-rinat, :
Я думаю, это можно через std::function сделать.
С std::function делать нет смысла. Разве что если C++14 нет.