Вы можете привязать к фиктивной функции:
void dummy() { /* has differing behaviour */ }
// ...
boost::bind(&dummy)();
... или, предполагая, что вы используете Boost.Bind
вместе с Boost.Function
, верните созданный по умолчанию объект функции и проверьте на empty()
перед его вызовом:
typedef boost::function<void (void)> F;
F create() { return F(); }
void use() {
F f = create();
if(f.empty()) {
/* ... */
}
}
По поводу обновления:
Я до сих пор не понимаю, в чем проблема с привязкой к другой функции, подобной следующей:
template <typename BRO>
Retval do_stuff(BRO func)
{
return func();
}
if(funcPtr) {
do_stuff(boost::bind(&use_retval, boost::bind(funcPtr, a, b)));
} else {
do_stuff(boost::bind(&do_fallback, fallback));
}
Если вы хотите убрать эту обработку из вызывающего кода, вы можете эмулировать функцию шаблона переменной для поддержки переменных арностей:
template<class R, class T1>
boost::function<R (T1)>
bind_wrap(R (*fnPtr)(), T1& t1, Fallback fallback) {
if(fnPtr) return boost::bind(&use_retval, boost::bind(funcPtr, t1));
else return boost::bind(&do_fallback, fallback);
}
template<class R, class T1, class T2>
boost::function<R (T1, T2)>
bind_wrap(R (*fnPtr)(T1, T2), T1& t1, T2& t2, Fallback fallback) {
if(fnPtr) return boost::bind(&use_retval, boost::bind(funcPtr, t1, t2));
else return boost::bind(&do_fallback, fallback);
}
// ... etc. for all needed arities
do_stuff(bind_wrap(funcPtr, var1, var2, fallback));
... или вы используете описанный выше подход для генерации boost::function<>
объектов или ваших собственных оболочек и проверьте на functor.empty()
или подобное в do_stuff()
.