void* в структуре

313
09 июля 2017, 13:55

Здравствуйте помогите новичку, дело в том что нужно записывать в данную структуру методы, а после вызывать

//структура содержаший метод и название 
struct actions
{
    std::string name;
    void* action;
};
menu mn;
mn.add("привет", &hh);
mn.add("привет1", &hh1);
mn.add("привет2", &hh2);
mn.getmenu();

вся проблема в том что я не знаю как правильно задать вопрос, если бы знал как правильно задать скорее всего решил бы проблемы, могу только описать что именно нужно. А нужно чтобы я смог записывать в vector структуру два типа один из них это простая строка а второй это метод(функция) которую я могу вызывать во время работы и при выборе из этого меню должно вызваться его функция которая хранится в структуре

получается:

 //структура содержаший метод и название 
  struct actions
  {
    std::string name;
    void* action;
  };

  HANDLE hConsole, hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
class menu
{
 public:
    vector<actions> menulst; //списко меню
    int m_pos;          // позиция меню
    int max_pos;        // максимальная позиция меню
    char s1[101]; //для перевода на кирилицу
    //добавление в список 
    template<class T>
    void add(string name,T action)
    {
        actions act;
        act.name = name;
        act.action(action);
        menulst.push_back(act);
        max_pos = menulst.size()+1;
    }// объявляем нужные
    void dif() //пустой метод
    {
        return;
    }// нам функции
    enum ConsoleColor //перечисление цветов
    {
        Black = 0,
        Blue = 1,
        Green = 2,
        Cyan = 3,
        Red = 4,
        Magenta = 5,
        Brown = 6,
        LightGray = 7,
        DarkGray = 8,
        LightBlue = 9,
        LightGreen = 10,
        LightCyan = 11,
        LightRed = 12,
        LightMagenta = 13,
        Yellow = 14,
        White = 15
    };
    char* ru(char* s) { AnsiToOem(s, s1);   return s1; } // вывод русским языком
    void SetColor(int text, int background) // устанавливаем цвет
    {
        HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
    }
    void GotoXY(int X, int Y) // позиция курсора
    {
        COORD coord = { X, Y };
        SetConsoleCursorPosition(hStdOut, coord);
    }
    //  void choice();
    void go(int x) // Если нажали Enter
    {
        menulst[x].action;
        choice();
    }
    void getmenu()
    {
        system("cls"); // очистить экран
        for (size_t i = 0; i < menulst.size(); i++)
        {
            if (m_pos == i + 1)
            {
                SetColor(6, 0);
                printf("%d) + %s\n", i, menulst[i].name.c_str());
            }
            else {
                SetColor(15, 0);
                printf("%d) %s\n", i, menulst[i].name.c_str());
            }
        }
        choice();
    }
    void choice() // функция выбора
    {
    l:
        int ch = _getch(); // считываем значение нажатой клавиши
        if (ch == 224) // 224 - это стрелочки
        {
            switch (ch)
            {
            case 80: // вниз
                if (m_pos + 1<max_pos) ++m_pos;
                getmenu();
                break;
            case 72: // вверх
                if (m_pos - 1 >= 0) --m_pos;
                getmenu();
                break;
            case 13: // Enter
                go(m_pos);
                break;
            default:
                goto l;
            }
        }
        switch (ch)
        {
        case 80: // вниз
            if (m_pos + 1<max_pos) ++m_pos;
            getmenu();
            break;
        case 72: // вверх
            if (m_pos - 1 >= 0) --m_pos;
            getmenu();
            break;
        case 13: // Enter
            go(m_pos-1);
            break;
        default:
            goto l;
        }
    }
    menu()
    {
        m_pos = 1;
        max_pos = menulst.size();
    }
    ~menu()
    {
    }
    };

ВСЕ получилось

попробуйте std::function action; вместо void* action;.

READ ALSO
Галерея лучше чем lightgallery? [требует правки]

Галерея лучше чем lightgallery? [требует правки]

Есть ли что еще более лучшее и совершеннее, чем JQuery плагин для просмотра изображений Light Gallery?

339
Мигающий header при скроле

Мигающий header при скроле

Решил сделать прилипающий header при скроле, при этом столкнулся с неприятным багомКогда происходит скрол header начинает мигать

350
MySQL: Сложение строк

MySQL: Сложение строк

Понадобилось сложение строки одного столбца в зависимости от датыВ итоге написал такое:

398
SQL запрос на отсутствие во множестве?

SQL запрос на отсутствие во множестве?

Помогите с запросом(mysql)

286