Хотя я не уверен на 100%, что понимаю вопрос, следующий код может удовлетворить вашу цель:
template< class R >
struct FCreateBind {
typedef boost::function< R() > result_type;
template< class T, class U >
result_type operator()( T const& x, U const& y ) const {
return boost::bind( x, y );
}
};
int main() {
BOOST_AUTO( generate, boost::bind( FCreateBind< bool >(), Callable(), _1 ) );
BOOST_AUTO( fn, generate( Arg() ) );
bool b = fn();
}
При этом, вероятно, это не так красиво, как ожидает спрашивающий ...
Как вы упомянули, если мы явно укажем одну из перегрузок boost::bind
, FCreateBind
не понадобится.Однако, насколько я видел, похоже, что не существует портативного способа определения перегрузки.Таким образом, в этом случае, вероятно, мы должны зависеть от внутреннего boost
.
. Для вашей информации при тестировании можно скомпилировать следующий код:
int main() {
namespace bb = boost::_bi; // Sorry, for brevity
bb::bind_t< bb::unspecified, Callable, bb::list1< bb::value< Arg > > >
(*bi)( Callable, Arg ) = boost::bind< bb::unspecified, Callable, Arg >;
BOOST_AUTO( generate, boost::bind( bi, Callable(), _1 ) );
BOOST_AUTO( fn, generate( Arg() ) );
bool b = fn();
}
Надеюсь, это поможет