相关疑难解决方法(0)

使用C++ 11接口包装C回调的最佳方法是什么?

假设这是一个要包装的C函数:

void foo(int(__stdcall *callback)());
Run Code Online (Sandbox Code Playgroud)

C函数指针回调的两个主要缺陷是:

  • 无法存储绑定表达式
  • 无法存储捕获lambda

我想知道包装这些函数的最佳方法.第一个对于成员函数回调特别有用,第二个对于使用周围变量的内联定义特别有用,但这些不是唯一用途.

这些特定函数指针的另一个属性是它们需要使用__stdcall调用约定.据我所知,这完全取消了lambda作为一种选择,否则会有点麻烦.我想至少__cdecl也允许这样做.

这是我能够提出的最好的东西,没有东西开始回归依赖于函数指针所没有的支持.它通常在标题中.以下是Coliru的示例.

#include <functional>

//C function in another header I have no control over
extern "C" void foo(int(__stdcall *callback)()) {
    callback();
}

namespace detail {
    std::function<int()> callback; //pretend extern and defined in cpp

    //compatible with the API, but passes work to above variable
    extern "C" int __stdcall proxyCallback() { //pretend defined in cpp
        //possible additional processing
        return callback();
    }
}

template<typename F> //takes anything
void wrappedFoo(F …
Run Code Online (Sandbox Code Playgroud)

c++ lambda callback stdbind c++11

12
推荐指数
2
解决办法
3453
查看次数

标签 统计

c++ ×1

c++11 ×1

callback ×1

lambda ×1

stdbind ×1