C++ 0x отказался от использования старых связующих, таких как bind1st
и bind2nd
в пользу общего std::bind
. C++ 0x lambdas прекрасно сочетаются с std::bind
, но они не связываются с классическими bind1st и bind2nd, потому что по умолчанию lambdas не имеют вложенных typedefs, таких как argument_type
, first_argument_type
, , second_argument_type
и result_type
. Итак, я думал, что std::function
может служить стандартным способом привязки lambdas к старым связующим, поскольку он предоставляет необходимые typedefs.Использование устаревших связующих и C++ 0x lambdas
Однако использование std::function
сложно в этом контексте, поскольку оно заставляет вас указывать тип функции при ее создании.
auto bound =
std::bind1st(std::function<int (int, int)>([](int i, int j){ return i < j; }), 10); // hard to use
auto bound =
std::bind1st(std::make_function([](int i, int j){ return i < j; }), 10); // nice to have but does not compile.
Я не мог найти удобный генератор объектов для std::function
. Что-то вроде std::make_fuction
было бы неплохо иметь. Существует ли такая вещь? Если нет, есть ли другой лучший способ привязки ламд к классическим связующим?
Обратите внимание, что использование классических связующих с lambdas может быть полезно для устаревших библиотек, которые ожидают, что их типы объектов функций будут раскрывать вышеупомянутые typedefs. Поэтому я не думаю, что ванильные лямбды можно использовать с такими библиотеками. – Sumant