如果嵌入在 boost::bind
返回对象中的函数指针是 NULL
/nullptr
/0
,我需要采取行动而不是调用它。如何确定对象是否包含空函数指针?
附录
- 我不相信我可以使用和比较
boost::function
,因为boost::bind
返回对象在模板函数中与不同的调用签名一起使用. - 简化示例:
template <typename BRO> Retval do_stuff(BRO func, enum Fallback fallback) { if (func == NULL) { return do_fallback(fallback); } else { return use_retval(func()); } } do_stuff(boost::bind(FuncPtrThatMightBeNull, var1, var2), fallback);
解决方案
由于被调用者中函数的数量不变,我可以将绑定(bind)返回对象“转换”为 boost::function
并调用 .empty()
Retval do_stuff(boost::function<Retval()> func, enum Fallback fallback)
{
if (func.empty())
return do_fallback(fallback);
else
return use_retval(func());
}
最佳答案
您可以绑定(bind)到一个虚拟函数:
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()) {
/* ... */
}
}
关于更新:
我仍然不明白像下面这样绑定(bind)到不同函数的问题是什么:
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()
.
关于c++ - boost::bind 与空函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2010532/