Существует довольно простое решение, использующее boost :: lambda с оператором запятой. В моем случае я использую ее для функции-модификатора, которая определяется как (B - произвольный класс, например, и A - это класс, который должен быть изменен, но находится в B и не должен выходить за пределы)
void B::modify( boost::function<void(A&)> func );
Мое намерение состоит в том, чтобы передать в модификатор только модификатор, который облегчает управление при его модификации (например, для испускания сигналов).
Иногда я хочу применить 2 модификатора:
void A::setInvalid();
void A::setX( int x );
Вызов в 2 шага, что не так (просто как ссылка, чтобы показать, как мы хотим использовать метод модификации):
instanceA->modify(
boost::bind( &A::setInvalid, _1 );
instanceA->modify(
boost::bind( &A::setX, _1, 4 );
Используя boost :: lambda, это можно объединить с одним вызовом функции, и поэтому создается только одна функция:
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
using namespace boost::lambda;
instanceA->modify(
( bind(&A::setInvalid, boost::lambda::_1)
, bind(&A::setX, boost::lambda::_1, 4) ) );
По вашему вопросу это будет выглядеть так:
using namespace boost::lambda;
boost::function<void()> func = ( bind(f), bind(g) )