【问题标题】:how to specify a c++ function pointer that may accept boost::bind'ed functions如何指定一个可以接受 boost::bind 函数的 c++ 函数指针
【发布时间】:2014-11-14 15:37:32
【问题描述】:

我正在尝试使用 boost::bind 存储任意回调函数的列表,以允许特定于回调的参数:

例如:

void callback1(int something) {...}
void callback2(int onething,theotherthing) {...}

回调系统将这些存储在容器中:

typedef void (*lpvFunc)();
// ...
std::map <int,lpvFunc>regged_callbacks;

还有注册功能:

registerCallback(int slot,lpvFunc cb) { regged_callbacks[slot]=cb; }

当我尝试进行绑定以适应回调时出现问题

registerCallback(1,boost::bind(callback2,42,31337));

和 shazbang 我得到如下编译器错误: ...注意:没有已知的参数 2 从 'boost::_bi::bind_t > >' 到 'lpvFunc {aka void (*)()}'|

的转换

那么我该如何解决才能使这项工作正常进行(因为 boost::asio 似乎能够在其指向回调的指针中接受此类内容)

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    您不能将原始函数指针存储到具有捕获的函子。您可以做的是存储类型擦除的函子,而不更改任何其他内容:

     typedef std::function<void()> lpvFunc;
    

    (或者Boost.Function,如果你不在 C++11 上)

    【讨论】:

    • 由于 gcc 4.7.1 (mingw) 还没有功能齐全的 c++11 支持,所以这种增强形式是什么? boost::function ?
    • @BrianJack:你的编译器当然支持std::function,即使它对 C++11 的整体支持还不是很完整。多年来我一直在 GCC 4.6 中使用它们。
    • @BrianJack 编辑以添加链接,这是我第一次打算这样做。
    • 感谢您的帮助,我确实得到了这个工作......我想知道如果代码检查 NULL 作为“无回调”条件(例如:如果我测试 cb= =NULL 并且在这种情况下不注册回调)
    • @BrianJack 如果fboost::functionstd::function,您可以使用if (f) { /* call f */ } else { /* no function */ }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多