About a year ago, I started a C++ project aiming to build a simple event system. Initially, I had subscribers as actual classes, but I later switched to functions, specifically member functions. Now I'm looking to learn how to wrap member functions, regular functions, and lambda functions into a single type. Is that doable? I remember seeing a video where they used function headers to bind functions, but I'm interested in crafting a solution from scratch instead. Does anyone have insights on how I could approach this, or at least some conceptual guidance?
3 Answers
One way to tackle this is by creating a Functor class that holds a function pointer and a reference pointer for 'this'. If the reference is null, you just invoke the function directly through the overloaded operator(). If it's not null, pass the reference as the first parameter to the function. Be careful though, passing the wrong reference could lead to crashes unless you implement some type checks with templates.
It probably depends on what you need, but you're looking at a few options here. You could use C-style function pointers, which are simple but lack the ability to capture references to objects. Alternatively, you could go for functor structs, which can store closure variables and class references. They're a bit of a hassle to create but offer flexibility. Then there's `std::function`, which does a lot of the heavy lifting for you, though it might be less customizable. Lastly, if you only need to use these functors without storing them, templates could work great, enforcing `operator()` to ensure compatibility.
You can use `std::function` to wrap up all sorts of callable entities like lambda expressions, bound expressions, or function pointers, including member functions. It's pretty versatile. You might want to check the cppreference site for more detailed examples of how this works!

I appreciate the suggestion, but I'm really looking to create my own version rather than use `std::function`. I'm curious about how I can implement the concept myself.