2015-11-29 3 views
8

Я новичок в C++ 11 лямбды и хотел бы превратить бинарную лямбду в одноместный один связывании второго параметра:Можно ли связать второй параметр лямбда-функции?

auto lambda1 = [] (int a, int b) { return a+b; }; 
auto lambda2 = std::bind2nd(lambda1, 5); 

компиляция завершится неудачно с

error: no type named 'first_argument_type' in 'struct main(int, char**)::<lambda(int, int)>' 
    class binder2nd 

[Как] это можно сделать?

+6

'авто lambda2 = [lambda1] (интермедиат а) {возвращение lambda1 (а, 5); } 'Просто забудьте' bind', lambdas проще в использовании и более читабельны. –

+0

'bind2nd' &' bind1st' 'устаревшие' и поэтому заменены на' bind' –

+0

@AnkitAcharya В C++ 17 возможно, но на данный момент они все еще действительны. В любом случае, это довольно теоретический интерес. – oarfish

ответ

8
#include <functional> 

int main(int argc, char *argv[]) 
{ 
    auto lambda1 = [](int a, int b) { return a+b; }; 
    auto lambda2 = std::bind(lambda1, std::placeholders::_1, 5); 
    //   ~~~~~~~^^^^~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^~~~ 
    return 0; 
} 

Demo

предпочитают также использовать std::bind над std::bind1st и std::bind2ndsince both were deprecated in C++11 и планируется быть удалены в C++ 17.

+0

Это связывает первый параметр, а не второй. Хотя обертывание другой лямбды, предложенной Коломбо, предпочтительнее, мне все же интересно, возможно ли это. – oarfish

+0

@oarfish Код as связывает второй параметр с '5'. – Columbo

+0

Упс, да, тест, который я сделал, был неисправен. – oarfish

12

Если вы уже использовать лямбда-выражения, просто используйте еще одну:

auto lambda2 = [&] (int i) {return lambda1(i, 5);}; 
+0

На самом деле я об этом не думал. Глупо. – oarfish

+0

Не могли бы вы объяснить: * почему * 'std :: bind2nd' не подходит? – user2079303

+0

@ user2079303 Потому что это устарело, неразборчиво и не является гибким каким-либо образом? – Columbo

Смежные вопросы