Ближайшим к тому, что вы хотите, может быть
auto minElement =
std::min_element(
std::begin(mySet),
std::end(mySet),
mem_fun_functor(&Foo::myWeakLessOperator)
);
. std::mem_fun
(устарело в c ++ 11) и std::mem_fn
оба оборачивают указатель на функцию-член, хотя оба принимают экземпляр какпараметр для вызова функции-члена.Если вам нужен функтор, который также оборачивает объект, я думаю, что вам нужно написать свой собственный:
auto mem_fun_functor =
[&bar](decltype(&Foo::myWeakLessOperator) f){
return [f,&bar](const Foo& a,const Foo& b) {
return (bar.*f)(a,b);
};
};
Однако, учитывая, что ни один из ответов не намного короче или не приводит к более чистому коду, я бы подумалпросто использовать свою первую версию с лямбда-выражением (если, возможно, у вас нет множества различных функций-членов, которые вы хотите использовать в качестве компаратора).
Что вы на самом деле подразумеваете под «упрощением»?Вам нужно указать объект, для которого вы хотите вызвать функцию-член, вам нужно указать, как вы хотите пересылать параметры.Это в основном все лямбда делает.
Откладывание всего этого на функтор, как, например, выше, делает ваш код более сложным, чем простым.В вашем первом фрагменте любой, кто знаком со стандартными алгоритмами, может взглянуть на эти несколько строк кода и полностью понять, что происходит.
В конечном счете это вопрос стиля, и то, что вы считаете читабельным, но возможность объявлять вещи в самом узком объеме - одно из больших преимуществ использования лямбд.