LINUX.ORG.RU

История изменений

Исправление 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 нет.