Как использовать лямбда-функции с boost:: bind/std:: bind в VС++ 2010?

У меня есть некоторые лямбда-функции, которые я хочу связать, используя либо 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>'

Итак, что является простейшим обходным путем для этого?

Ответы

Ответ 1

Вам нужно вручную указать тип возврата:

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

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

Ответ 2

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

Ответ 3

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