如何使用std :: function作为C风格的回调

 Mr_ZERO0000000 发布于 2023-02-13 18:47

如何std::function在需要C风格回调的函数中使用?

如果这是不可能的,那么下一个最好的事情是什么?

例:

// --- some C code I can not change ---
typedef void(*fun)(int);
void register_callback(fun f) {
    f(42); // a test
}
// ------------------------------------

#include 
#include 

void foo(const char* ptr, int v, float x) {
    std::cout << ptr << " " << v << " " << x << std::endl;
}

int main() {
    std::function myf = std::bind(&foo, "test", std::placeholders::_1, 3.f);
    register_callback(myf); // <-- How to do this?
}

Drax.. 13

在大多数情况下,你不能.

但是如果你在std :: function中存储了一个C风格的回调函数,你可以使用target()成员函数.

2 个回答
  • 答案很长:有点儿.您可以编写一个C函数来传递给调用您的API std::function:

    // --- some C code I can not change ---
    typedef void(*fun)(int);
    void register_callback(fun f) {
        f(42); // a test
    }
    // ------------------------------------
    
    #include <functional>
    #include <iostream>
    
    void foo(const char* ptr, int v, float x) {
        std::cout << ptr << " " << v << " " << x << std::endl;
    }
    
    namespace {
    std::function<void(int)> callback;
    extern "C" void wrapper(int i) {
        callback(i);
    }
    }
    
    int main() {
        callback = std::bind(&foo, "test", std::placeholders::_1, 3.f);
        register_callback(wrapper); // <-- How to do this?
    }
    

    2023-02-13 18:49 回答
  • 在大多数情况下,你不能.

    但是如果你在std :: function中存储了一个C风格的回调函数,你可以使用target()成员函数.

    2023-02-13 18:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有