/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, PHP, Ruby,
C#, VB, Perl, Swift, Prolog, Javascript, Pascal, HTML, CSS, JS
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <iostream>
#include <type_traits>
void(*g_callback)(void* context);
void* g_ctx;
// C-style callback
void c_set_callback(void(*callback)(void* context), void* context)
{
g_callback = callback;
}
void execute_callback()
{
g_callback(g_ctx);
}
// C++ callable parameter
template<typename Function>
void set_callback(Function&& function)
{
c_set_callback
([](void* context)
{
(*reinterpret_cast<typename std::decay<Function>::type*>(context))();
}
, reinterpret_cast<void*>(&function)
);
}
void function()
{
std::cout << "function called" << std::endl;
}
struct Functor
{
void operator()() const
{
}
};
int main()
{
// function as callable
set_callback
(function
);
execute_callback();
// functor as callable
Functor functor;
set_callback
(functor
);
execute_callback();
// lambda as callable
int result = 0;
set_callback
([&result]()
{
result = 1;
std::cout << "lambda called" << std::endl;
}
);
execute_callback();
return 0;
}