Skip to content

How-to Handle C-style Callbacks in C++

Regist member function with C-Style callback

#include <iostream>
using namespace std;

// https://en.cppreference.com/w/cpp/language/pointer

class delegate;
union callback
{
    int (*func_in_c)(int);
    int (delegate::*func_in_cpp)(int);
};

typedef int (*callback_func)(int num);
void do_something(callback_func f, int n)
{
    if (f)
        f(n);
}

class delegate
{
public:
    delegate() { init(); }
    ~delegate() = default;

    void init()
    {
        callback cb;
        cb.func_in_cpp = &delegate::test;
        do_something(cb.func_in_c, 10);
    }

    // https://stackoverflow.com/a/71194688
    void init2()
    {
        static auto f = [this](int n)
        {
            return test(n);
        };
        do_something(
            [](int n)
            {
                return f(n);
            }, 11);
    }
private:
    int test(int n)
    {
        cout << __FUNCTION__ << ": " << n << endl;
        return 0;
    }
};

int main(void)
{
    delegate d;
    d.init2();
    return 0;
}