Здравствуйте, о_О, Вы писали:
о_О>Здравствуйте, jazzer, Вы писали:
J>>они мономорфные, типы надо явно указывать, что тут еще обосновывать...
о_О>Это С++, а не Йуморле. Большего ожидать не стоит.
Никаких принципиальных проьблем сделать это в С++ я лично не вижу.
Boost.Lambda как-то с этим справляется в рамках С++: _1 < _2.
Вот это — хороший, годный синтаксис для лямбд.
Вот таким он примерно и должен быть, только должен быть встроенным в язык, чтоб были плюшки в виде нормальной диагностики и т.д.
На самом деле, нынешние лямбды — это просто сахар для объявления/определения локального класса-функтора.
И чтоб его можно было использовать со всякими std::for_each, пришлось поменять стандарт и явно разрешить параметризовать шаблоны локальными классами.
Полиморфные лябмды а ля Boost.Lambda элементарно реализуются аналогичным образом, только оператор у функтора должен быть шаблонным, что сейчас запрещено для локальных классов. Если это разрешить — получим нормальные полиморфные лябмды, т.е. такая запись
[...](auto _1, auto _2) { return _1 < _2; }
будет транслироваться в нечто вроде
struct Lambda
{
... // captures
template <class T1, class T2>
operator()(T1 _1, T2 _2) const { return _1 < _2; }
};
а такой лябмдой уже можно будет итерироваться по std::tuple, к примеру.