I want to start off by saying that I am a newbie in C++.
I created a static class that displays a menu. The displayMenu method is void and it accepts map<string, function<void()> as argument.
void Menu::displayMenu(map<string, function<void()>> menu_items)
And it can be used as:
map<string, function<void()>> menu_items;
menu_items["1st item"] = bind(&DummyClass::DummyMethodOne, DummyClass());
menu_items["2nd item"] = bind(&DummyClass::DummyMethodTwo, DummyClass());
Menu::displayMenu(menu_items);
The output of what i have explained so far is 2 lines in cmd:
1st item
2nd item
where if the user selects the 1st item it executes the DummyMethodOne of the DummyClass
and if the user executes the 2nd item it executes the DummyMethodTwo of the DummyClass.
The user selection is being handled by the Menu class.
I can even execute another Menu by following similar methodology as explained above (i.e. by having another menu items map in DummyClass::DummyMethodOne)
So far the code works great!
However, now i want to keep a history of which menu was the previous one so i can have a “Back” menu item that takes the user to the previous menu.
I tried doing it by creating a singleton class that keeps the history in a vector. The vector holds the map argument of the displayMenu method:
vector<void (*)(map<string, function<void()>>, string, int, int)> history;
I tried the “THread-Safe singleton” found in this url: https://refactoring.guru/design-patterns/singleton/cpp/example#example-1
I named my singleton class HistoryKeeper and added the void method:
Taken from HistoryKeeper.h file:
void AddAndExecute(void (*fnItem)(map<string, function<void()>>));
So it can be used like this:
#include "HistoryKeeper.h"
...
HistoryKeeper* history = HistoryKeeper::GetInstance();
map<string, function<void()>> menu_items;
menu_items["Item 1"] = bind(&DummyClass::DummyMethodOne, DummyClass());
menu_items["Item 2"] = bind(&DummyClass::DummyMethodTwo, DummyClass(), "is working!!");
menu_items["Item 3"] = bind(&DummyClass::DummyMethodTwo, DummyClass(), "is working!!");
history->AddAndExecute(Menu::displayMenu(menu_items));
But im getting multiple errors which one of those is the below:
error: invalid use of void expression at line history->AddAndExecute(Menu::displayMenu(menu_items));
Can somebody guide me to the correct way of implementing something like this?
Also if anyone can help me on how to define the AddAndExecute using perhaps templates to make its arguments more generic (that having to depend on that specific function with those specific arguments).
Thank you in advance!
What I am expecting:
To use the HistoryKeeper’s class method:
void AddAndExecute(void (*fnItem)(map<string, function<void()>>));
To keep track of all the menus the user went through
Memphis Rosewell is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.