Boost.Phoenix и Boost.Lambda до него преуспевают в определенных задачах, но не в других. Один из тех, с которыми он не работает, связан с непосредственным вызовом функции по имени.
Boost.Phoenix лямбды могут быть быстро и легко созданы для перегруженных операторов. Но если вам нужно имя функции, то вы должны использовать уродливый синтаксис:
boost::phoenix::bind(&boost::weak_ptr::expired, boost::phoenix::arg_names::_1)
Так выглядит ваша лямбда. Вы можете использовать некоторые директивы using
, чтобы обрезать пространства имен, но в конечном итоге это будет выглядеть так. Это на самом деле ничем не отличается от использования boost::bind
на данный момент:
boost::bind(&boost::weak_ptr::expired, _1)
Boost.Phoenix и Boost.Lambda перед ним лучше всего использовать для лямбда-выражений, в которых используются перегруженные операторы, или явно определенных объектов действий Phoenix. Если у вас есть просто старая функция или функция-член, вы должны связать ее, чтобы вызвать. Так что вы можете просто использовать boost::bind
.