Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
GbaLog-
Любитель чаепитий
2620 / 1159 / 284
Регистрация: 24.08.2014
Сообщений: 4,226
Записей в блоге: 1
Завершенные тесты: 2
#1

Идеи реализации класса Menu - C++

05.07.2016, 13:58. Просмотров 341. Ответов 8
Метки нет (Все метки)

Добрый день. В общем хочу разработать шаблонный класс Menu, чтобы постоянно не писать switch{}, но не знаю, как лучше сделать, суть в том, что есть несколько вариантов, а какой лучше и легче по реализации я понять не могу.
1. Сделать класс Menu_item, в котором будет содержаться строка(название пункта меню) и функция, которую надо вызвать при выборе этого пункта.
Примерно:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
template<class T>
class Menu_item
{
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    Menu_item
            (
                std::string name_item,
                T func
            )
            :
            name(name_item),
            func(func)
    {}
    //-----------------------------------------------------------------------------------
    template<class... Args>
    void operator()(Args... arg)
    {
        func(arg...);
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    T func;
    std::string name;
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
void func(int a, int b)
{
    std::cout << a + b << std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    Menu_item<void(*)(int,int)> m{"asd",func};
    m(1,4);
}

2. Сделать тоже самое, только с std::function<>
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
#include <functional>
/////////////////////////////////////////////////////////////////////////////////////////
template<class T>
class Menu_item
{
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    Menu_item
            (
                std::string name_item,
                std::function<T> func
            )
            :
            name(name_item),
            func(func)
    {}
    //-----------------------------------------------------------------------------------
    template<class... Args>
    void operator()(Args... arg)
    {
        func(arg...);
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    std::function<T> func;
    std::string name;
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
void func(int a, int b)
{
    std::cout << a + b << std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    Menu_item<void(int,int)> m{"asd",func};
    m(1,4);
}

3. Сделать всё в одном классе, без всяких итемов и прочего.

Это лишь мои варианты. Если у вас есть свои варианты или дополнение к моим, то пишите, так же буду рад любым советам по теме.

Ещё хотелось бы сделать так, чтобы при надобности совать меню в меню.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2016, 13:58     Идеи реализации класса Menu
Посмотрите здесь:

Трудности в реализации класса - C++
Не могу понять, почему не работают конструкторы класса... Прошу понятного объяснения=) вот код 1 файл #ifndef ___MAS #define ___MAS...

Отделение интерфейса класса от реализации - C++
Осваиваю раздел одной книги &quot;Отделение интерфейса класса от реализации&quot;. То что получилось можно и нужно скачать по адресу...

код реализации класса вектор - C++
привет!!!!!!! поделитесь пожалусто кодом реализации класса вектор!!!!!! пожалусто........ нужно к завтрашнему(((99:help::'(

Детали реализации конструктора класса - C++
Есть конструктор условного класса картинки и я не совсем понимаю нескольких вещей: #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Ошибки в реализации класса Vector3D - C++
Здравствуйте. Помогите дурачку. Создать класс Vector3D. Реализовать: сложение векторов, скалярное умножение векторов, умножение вектора...

Отделение интерфейса класса от его реализации - C++
Всем привет! Прочитал все найденные похоже темы, но ответа на свой вопрос я не нашел. Поэтому создаю тему... Хочу отделить интерфейс...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
05.07.2016, 14:03     Идеи реализации класса Menu #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от GbaLog- Посмотреть сообщение
Если у вас есть свои варианты или дополнение к моим, то пишите, так же буду рад любым советам по теме.
C++
1
2
3
4
class Menu{
//...
vector<pair<string, function<Type>>> mItems;
};
Это третий вариант?
Недавно реализовывали подобное как раз.
Работает нормально.
Что-то подобное для использования:
C++
1
2
menu.addItem("bla-bla-bla", [](){/**/});
menu.show();
GbaLog-
Любитель чаепитий
2620 / 1159 / 284
Регистрация: 24.08.2014
Сообщений: 4,226
Записей в блоге: 1
Завершенные тесты: 2
05.07.2016, 14:09  [ТС]     Идеи реализации класса Menu #3
Croessmah, Ну я для этого и сделал класс Menu_item, чтобы в вектор эти итемы пихать в Menu. Я забыл класс Menu набросать. Вот это fail.

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/////////////////////////////////////////////////////////////////////////////////////////
class Menu
{
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    Menu();
    //-----------------------------------------------------------------------------------
    template<class T>
    void        add(Menu_item<T> item)
    {
        m_items.push_back(item);
    }
    //-----------------------------------------------------------------------------------
    ...
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    std::vector<Menu_item> m_items;
};
/////////////////////////////////////////////////////////////////////////////////////////
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
05.07.2016, 14:12     Идеи реализации класса Menu #4
Цитата Сообщение от GbaLog- Посмотреть сообщение
Ещё хотелось бы сделать так, чтобы при надобности совать меню в меню.
Ну, в нашем меню это выглядит так:
C++
1
menu.addItem("bla-bla-bla" [&menu2](){menu2.show();}
GbaLog-
Любитель чаепитий
2620 / 1159 / 284
Регистрация: 24.08.2014
Сообщений: 4,226
Записей в блоге: 1
Завершенные тесты: 2
05.07.2016, 14:29  [ТС]     Идеи реализации класса Menu #5
Croessmah, Собственно, новый вопрос, как член класса сделать шаблонным, не делая шаблонным весь класс?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
#include <functional>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
class Menu
{
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    Menu();
    //-----------------------------------------------------------------------------------
    template<class T>
    void        add(std::string name,std::function<T> item)
    {
        m_items.push_back(std::make_pair(name,item));
    }
    //-----------------------------------------------------------------------------------
    template<class... Args>
    void        get(int n,Args... args)
    {
        m_items[n](args...);
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    template<class T>
    std::vector<std::pair<std::string,std::function<T>> m_items;
};
/////////////////////////////////////////////////////////////////////////////////////////
void func(int a, int b)
{
    std::cout << a + b << std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    Menu menu;
    menu.add("bla",std::function<void(int,int)>(func));
    menu.get(0,1,2);
}
Может я что-то не так делаю, но не вижу, что именно.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
05.07.2016, 14:33     Идеи реализации класса Menu #6
Цитата Сообщение от GbaLog- Посмотреть сообщение
как член класса сделать шаблонным, не делая шаблонным весь класс?
В Вашем случае придется писать (или использовать готовую)
реализацию type erasure, ну или как-то по другому выкручиваться.
Зачем здесь вообще шаблон?
Почему не просто std::function<void()>?
GbaLog-
Любитель чаепитий
2620 / 1159 / 284
Регистрация: 24.08.2014
Сообщений: 4,226
Записей в блоге: 1
Завершенные тесты: 2
05.07.2016, 14:49  [ТС]     Идеи реализации класса Menu #7
Croessmah, Ну как же? А аргументы? Если просто void() сделать, то аргументы уже не всунуть никак.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
05.07.2016, 14:51     Идеи реализации класса Menu #8
Цитата Сообщение от GbaLog- Посмотреть сообщение
Если просто void() сделать, то аргументы уже не всунуть никак.
Адаптеры же. Вон выше в лямбду захватывается объект menu2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2016, 15:01     Идеи реализации класса Menu
Еще ссылки по теме:

Объявление класса без его реализации - C++
Добрый день! Я (вроде бы) знаю как объявлять класс, не подключая его в хедере class MyClass; ... public: myFunc(MyClass);

IDE с автосозданием и измененим реализации класса - C++
Есть ли IDE, которые представляют возможность для классов: //some.h class Some { private: int x, y, z; public: Some(); ...

Не использовать имя класса при его реализации - C++
Из-за того, что не смог грамотно сформулировать свой вопрос, не нашел ничего в гугле :( Поэтому объясню на примере: Допустим, есть...

Способ сокрытия данных и реализации класса от клиента - C++
Всем привет! Представляю свою разработку, основанную на модернизации примера сокрытия структуры и реализации целевого класса от любопытных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
GbaLog-
Любитель чаепитий
2620 / 1159 / 284
Регистрация: 24.08.2014
Сообщений: 4,226
Записей в блоге: 1
Завершенные тесты: 2
05.07.2016, 15:01  [ТС]     Идеи реализации класса Menu #9
Что-то я совсем запутался. Ну ладно, утро вечера мудренее.
Yandex
Объявления
05.07.2016, 15:01     Идеи реализации класса Menu
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru