Как использовать лямбда-функции с boost :: bind / std :: bind в VC ++ 2010? - PullRequest
16 голосов
/ 05 января 2011

У меня есть несколько лямбда-функций, которые я хочу связать, используя boost :: bind или std :: bind. (Не важно, какой из них, пока он работает.) К сожалению, оба из них дают мне разные ошибки компилятора:

auto f = [](){ cout<<"f()"<<endl; };
auto f2 = [](int x){ cout<<"f2() x="<<x<<endl; };

std::bind(f)(); //ok
std::bind(f2, 13)(); //error C2903: 'result' : symbol is neither a class template nor a function template

boost::bind(f)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda0>'
boost::bind(f2, 13)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda1>'

Итак, какой самый простой обходной путь для этого?

Ответы [ 3 ]

22 голосов
/ 05 января 2011

Вам необходимо вручную указать тип возвращаемого значения:

boost::bind<void>(f)();
boost::bind<int>(f2, 13)();

Вы также можете написать себе функцию-шаблон для автоматического определения типа возвращаемого значения, используя Boost.FunctionTypes для проверки оператора вашей лямбды (), если выне люблю явно указывать bind.

8 голосов
/ 05 января 2011
std::function<void ()> f1 = [](){ std::cout<<"f1()"<<std::endl; };
std::function<void (int)> f2 = [](int x){ std::cout<<"f2() x="<<x<<std::endl; };
boost::function<void ()> f3 = [](){ std::cout<<"f3()"<<std::endl; };
boost::function<void (int)> f4 = [](int x){ std::cout<<"f4() x="<<x<<std::endl; };

//do you still wanna bind?
std::bind(f1)(); //ok
std::bind(f2, 13)(); //ok
std::bind(f3)(); //ok
std::bind(f4, 13)(); //ok

//do you still wanna bind?
boost::bind(f1)(); //ok
boost::bind(f2, 13)(); //ok
boost::bind(f3)(); //ok
boost::bind(f4, 13)(); //ok
1 голос
/ 05 января 2011

Думаю, вас заинтересует это сообщение на форуме MSDN . Похоже, что у постера была та же проблема, что и у вас, и возникла ошибка в MS Connect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...