записать короче? &string::empty, как я понимаю, принимать может только указатель, а мне нужен предикат, который можно вставить в std-совместимую функцию типа (псевдокод) any_string_empty(strings) = any_of(strings, &string::empty)
mem_fn? Не то чтобы супер экономия по сравнению с лямбдой конечно
кажется, что лямбда — тяжёлая синтаксическая конструкция, затрудняет читаемость; вот "стрелочный" синтаксис смотрелся бы гораздо легче
А что там тяжелого то.
Он бы имел смысл если эта самая лямбдя будет в одну строку
1. список захватов 2. список аргументов с типами 3. фигурные скобки 4. return 5. точка с запятой
[](const string & arg) { return arg.empty(); } помещается в одну строку. в чём проблема?
Последний тематический холивар был две недели назад: можете ознакомиться =)
Теоретически должно быть можно, в ranges помнится всяко продвигали pointer to members в качестве projection, не вижу причин чтобы оно не работало. Хотя иногда и не работает: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94973
Хотя да, Лававей прав, если бы было any_of<&string::empty>, оно бы заоптимизировалось. А так оно порождает функцию, параметром шаблона является указатель на любую функцию string, которая возвращает bool. А значит это всегда call, оно не инлайнится. Хм, а это значит и в projection использовать pointer to members такое себе.
Но можно с nttp написать такую вспомогашку, типа any_of(..., my:: projection<&string::empty>())
Тебе кажется, очень быстро привыкаешь, и потом лямбды в других языках кажутся обрезками
я профессионально пишу на С++ с 2006, до сих пор не привык
Обсуждают сегодня