c++ - boost::bind 与空函数指针

标签 c++ boost function-pointers bind boost-bind

如果嵌入在 boost::bind 返回对象中的函数指针是 NULL/nullptr/0 ,我需要采取行动而不是调用它。如何确定对象是否包含空函数指针?

附录

  1. 我不相信我可以使用和比较 boost::function,因为 boost::bind 返回对象在模板函数中与不同的调用签名一起使用.
  2. 简化示例:
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/

相关文章:

c++ - 深度优先搜索 (C++)

c++ - 获取错误 150 : C++ feature not enabled during compilation

c++ - C++ 中的千位分隔符

c++ - 字符串到字节的转换

c++ - 是否可以使用支撑初始化列表构造 boost::circular_buffer ?

c++ - 使用cmake和vs2010链接到静态boost lib而不自动链接

c++ - 为什么 std/boost::format 会导致这种 c_str() 行为?

c++ - 可以使用函数指针数组来删除分支吗

c++ - STL函数和函数类型 vs 函数指针类型

c++ - 在 C++ 中调用指向成员函数的指针时出错