随笔 - 741  文章 - 0  评论 - 260  阅读 - 416万

How to use a std::function as a C style callback

How can I use a std::function in a function which expects a C-style callback?

If this is not possible, what is the next best thing?

Example:

// --- 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;
}

int main() {
    std::function<void(int)> myf = std::bind(&foo, "test", std::placeholders::_1, 3.f);
    register_callback(myf); // <-- How to do this?
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?
}
posted on   莫水千流  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2020-09-07 android layerlist 里面的rotate标签得到三角形原理详解
2020-09-07 Android开发:shape和selector和layer-list的(详细说明)
2015-09-07 consist of, made up of
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示