0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
1

Функция, которая воспринимает в себя неизвестно кол-во функций

01.01.2022, 18:07. Показов 1000. Ответов 10

Author24 — интернет-сервис помощи студентам
Сначала вне всех функций объявляю глобальный не инициализированный массив функций
C++
1
void* (Funcs)();
Затем создаю вариативные шаблоны(мне на форуме показали такое со строками), я так понимаю с функциями уже такое не пашет, просьба, найдите пожалуйста ошибку). Функции поместить в массив, и поэлементно использовать в цикле.
C++
1
2
3
4
5
    template<class ... Args>
 
    void SetFunc(Args&&... args) {
         const void* (Funcs[sizeof...(args)])() = { forward<Args>(args)... };
    }
Остальной код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void a() {
    cout << "Hello" << endl;
    Sleep(1000);
}
void b() {
    cout << "World" << endl;
    Sleep(1000);
}
 
int main() {
    Menu::SetFunc(a, b); //функций может быть сколько угодно
    system("pause");
    return 0;
}
И заодно, как проверить проинициализирована функция или нет в другой функции.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.01.2022, 18:07
Ответы с готовыми решениями:

Функция которая принимает в себя 3 числа
Доброе время суток, подскажите как сделать такой пример Описать функцию, которая принимает в...

Функция, которая принимает в себя длину строки, символ, направление
День добрый, подскажите как лучше сделать ??? Я немного сделал, но не понятно &quot;под углом 45 и...

Составьте программу, которая определяет кол-во отрицательных, кол-во положительных и кол-во нулей среди введеных чисел
Составьте программу, которая определяет кол-во отрицательных, кол-во положительных и кол-во нулей...

Функция, которая возвращает кол-во уникальных элементов в векторе
Существует ли ф-я, которая возвращает кол-во уникальных элементов в векторе?

Написать программу, которая по введенному значению кол-ва ворон напечатает их кол-во текстом
На дереве сидит N ворон (20&lt;=N &lt;100). Написать программу, которая по введенному значению кол-ва...

10
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
01.01.2022, 18:52 2
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
#include <chrono>
#include <functional>
#include <iostream>
#include <thread>
 
void func1() {
    using namespace std::chrono_literals;
    std::cout << "Hello ";
    std::this_thread::sleep_for(2s);
}
 
void func2() {
    using namespace std::chrono_literals;
    std::cout << "world\n";
    std::this_thread::sleep_for(2s);
}
 
int main() {
 
    std::vector<std::function<void()>> funcs;
    funcs.push_back(func1);
    funcs.push_back(func2);
 
    for (const auto& func : funcs) {
        func();
    }
 
    return 0;
}
2
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
01.01.2022, 19:12 3
Цитата Сообщение от RomanZemin Посмотреть сообщение
Сначала вне всех функций объявляю глобальный не инициализированный массив функций
Не может быть никакого "массива функций". Язык такого не допускает.

Можно создать массив указателей на функции.
1
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
01.01.2022, 20:20  [ТС] 4
C++
1
2
3
void SetFunc(Args&&... args) {
         const void* (Funcs[sizeof...(args)])() = { forward<Args>(args)... };
    }
С векторами очень хорошая идея, но как запихнуть туда неизвестное кол-во функций? И вектор находящийся вне функции(глобальный) подвергнется ли изменениям после выполнения функции?
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
01.01.2022, 20:36 5
Цитата Сообщение от RomanZemin Посмотреть сообщение
void SetFunc(Args&&... args) {
         const void* (Funcs[sizeof...(args)])() = { forward<Args>(args)... };
    }
Что это вообще такое? Что такое Args?

Цитата Сообщение от RomanZemin Посмотреть сообщение
С векторами очень хорошая идея, но как запихнуть туда неизвестное кол-во функций?
Какая разница, вектор или массив?

Цитата Сообщение от RomanZemin Посмотреть сообщение
И вектор находящийся вне функции(глобальный) подвергнется ли изменениям после выполнения функции?
Будете изменять - подвергнется. Не будете изменять - не подвергнется. Откуда же нам знать, чему он там в вашем коде "подвергнется"?
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
01.01.2022, 20:42  [ТС] 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что это вообще такое? Что такое Args?
вариативный шаблон, выше код был указан.
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
01.01.2022, 20:46 7
Цитата Сообщение от RomanZemin Посмотреть сообщение
вариативный шаблон, выше код был указан.
Ну так, еще раз: не может быть никакого "массива функций". Язык такого не допускает. Можно создать массив указателей на функции

C++
1
2
3
4
5
template<typename ...Args>
void SetFunc(Args &&...args) 
{
  const void *(* Funcs[])() = { args... };
}
sizeof...(args) и std::forward здесь ни к чему.
1
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
01.01.2022, 20:52  [ТС] 8
всё, ошибок не выдаёт, не могу разобраться как мне вынести одно объявление до функции, а саму инициализацию в функцию?

C++
1
2
3
4
5
template<typename ...Args>
    void SetFunc(Args&&... args)
    {
        const void* (*funcs[])() = { args... };
    }
0
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
01.01.2022, 21:02 9
Цитата Сообщение от RomanZemin Посмотреть сообщение
С векторами очень хорошая идея, но как запихнуть туда неизвестное кол-во функций?
А как ты в массив будешь пихать неизвестное количество функций?
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
01.01.2022, 21:09  [ТС] 10
Делаю свою библиотеку для удобства, кол-во функций я указываю в самом коде. Тобишь если указываю две функции, то он и будет работать с двумя, я уже разобрался и сделал то же самое с текстом, указываю в функцию несколько аргументов(string), функция внутри помещает их в массив и уже после работает с этим, хотелось бы сделать то же самое с функциями.
0
4768 / 2578 / 892
Регистрация: 29.11.2010
Сообщений: 5,575
01.01.2022, 23:27 11
Лучший ответ Сообщение было отмечено RomanZemin как решение

Решение

RomanZemin, как насчёт использования структур и функторов?

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
#include <iostream>
#include <functional>
 
struct MenuItem {
    std::string name;
    std::function<void()> callable;
};
 
void doSomething() {
    std::cout << "I did something!" << std::endl;
}
 
struct More {
    void operator()() {
        std::cout << "I did more!" << std::endl;
    }
};
 
int main() {
 
    MenuItem menu[]{
            // ссылка на функцию
            {"Do something",      doSomething},
            // лямбда
            {"Do something else", []() {
                std::cout << "I did something else!" << std::endl;
            }},
            // да и вообще любой функтор
            {"Do more", More()},
    };
 
    for (MenuItem &menuItem : menu) {
        std::cout << menuItem.name << std::endl;
    }
    menu[0].callable();
    menu[1].callable();
    menu[2].callable();
 
    return 0;
}
Добавлено через 17 минут
Пример реализации класса меню на функторах.

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <functional>
 
struct MenuItem {
    std::string name;
    std::function<void()> callable;
};
 
class Menu {
public:
    Menu(const std::initializer_list<MenuItem> &items): items{items} {
        this->items.push_back({"Quit", [this]() { quit = true; }});
    }
    void run() {
        quit = false;
        while (!quit) {
            for (std::size_t i = 0; i < items.size(); ++i) {
                std::cout << i << ". " << items[i].name << std::endl;
            }
            std::size_t item ;
            do {
                std::cout << "Enter items item [0.." << items.size() - 1 << "]: ";
                std::cin >> item;
            } while (item >= items.size());
            items[item].callable();
        }
    }
private:
    bool quit;
    std::vector<MenuItem> items;
};
 
struct MyStatefullApp {
public:
    MyStatefullApp(): x{}, y{} {}
 
    void enterX() {
        std::cout << std::endl << "Enter X: ";
        std::cin >> x;
        std::cout << std::endl << "You have entered: " << x << std::endl;
    }
 
    void enterY() {
        std::cout << std::endl << "Enter Y: ";
        std::cin >> y;
        std::cout << std::endl << "You have entered: " << y << std::endl;
    }
 
    void printSum() const {
        std::cout << std::endl << x << " + " << y << " = " << x + y << std::endl;
    }
 
private:
    double x;
    double y;
};
 
int main() {
 
    MyStatefullApp application{};
 
    Menu menu{
            {"Enter X", [&application]() {
                application.enterX();
            }},
            {"Enter Y", [&application]() {
                application.enterY();
            }},
            {"Print Sum", [&application]() {
                application.printSum();
            }},
    };
 
    menu.run();
 
    return 0;
}
3
01.01.2022, 23:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.01.2022, 23:27
Помогаю со студенческими работами здесь

Почему функция не воспринимает имя
Есть такая функция: s1q1_total= def team (name): name+'q1'+'_total'.append(b) ...

функция не правильно воспринимает переданные ей параметры
tree_node *&amp; tree_node::get_root() { tree_node *tmp = this-&gt;root; return tmp; } int ...

Функция strtok() не воспринимает пробел как разделитель
Функция успешно разделяют строку на лексемы из массива символов stri, но при вводе строки с...

Строки. Написать программу, которая выводит текст на экран дисплея, определяет кол-во предложений текста и кол-во слов в каждом предложении...
С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000...

Напишите программу, которая выводит все простые числа в диапазоне от 2 до N ( N заранее неизвестно)
Не проходит два теста по времени. Что можно предпринять? def is_prime(n): if n % 2 == 0: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru