member functions в качестве UnaryFunction для алгоритмов

Antervis
Antervis

Простой пример:

vector v = {"abc"s, ""s, "123"s};
// Поиск пустой строки - сейчас
auto it = find_if(v.begin(), v.end(), [](auto &s) { return s.empty() });
// Поиск пустой строки - предлагаемый
auto it = find_if(v.begin(), v.end(), &string::empty);

Если я правильно понимаю, в реализации алгоритмов изменится только явный вызов на std::invoke.

1
рейтинг
5 комментариев
rumyancev95
Может быть стоит.Ну а сейчас, первое что пришло в голову, можно написать что то вроде такого например:

template <class Function, class...Args>
auto to_lambda(Function&& func, Args&&... args)
{
return [func, args...](auto&& obj){
return (obj.*func)(args...);
};
}

И использовать ваш алгоритм так:

auto it = std::find_if(v.begin(), v.end(), to_lambda(&std::string::empty));

Либо с каким-угодно параметром. Как удобно.
rumyancev95
Antervis
rumyancev95, для этого есть std::mem_fn. Просто можно обойтись даже без него
Antervis
rumyancev95
Antervis, Да точно, спасибо
rumyancev95
Антон Бикинеев
Возможно, это частный юз-кейз наиболее обобщенного пропозала Unified Function Call Syntax
Антон Бикинеев
Andrey Davydov
В range-v3, а значит и в STL2, это уже работает.
Andrey Davydov
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).