Implementing a Simple Button Class with std::function
Discover how to implement a Button class using std::function and its optimization.
Using std::function to store actions in a Button class
Assume that we set out to implement a Button class. We can then use the std::function to store the action corresponding to clicking the button so that when we call the on_click() member function, the corresponding code is executed.
We can declare the Button class like this:
Press + to interact
class Button {public:Button(std::function<void(void)> click) : handler_{click} {}auto on_click() const { handler_(); }private:std::function<void(void)> handler_{};};
We can then use it to create a multitude of buttons with different actions. The buttons can conveniently be stored in a container because they all have the same type:
Press + to interact
auto create_buttons () {auto beep = Button([counter = 0]() mutable {std::cout << "Beep:" << counter << "! ";++counter;});auto bop = Button([] { std::cout << "Bop. "; });auto silent = Button([] {});return std::vector<Button>{beep, bop, silent};}
Iterating the list and calling on_click() on each button will execute the corresponding function:
Press + to interact
C++
const auto& buttons = create_buttons();for (const auto& b : buttons) {b.on_click();}buttons.front().on_click(); // counter has been incremented// Output "Beep: 0! Bop. Beep: 1!"
...
Ask