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

Организация вызовов функций - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Какой вариант оформления функции лучше? http://www.cyberforum.ru/cpp-beginners/thread1227233.html
Допустим, есть функция, которая что-то делает и, возвращает булево значение, в зависимости от того, получилось это сделать или нет. //Вариант 1 bool func(int a) { if (a != 0) { /* Тут код
C++ Составить функцию, принимающую переменное количество параметров Напишите и протестируйте шаблонную функцию с переменным числом аргументов sum_values(), которая принимает список произвольной длины с аргументами, имеющими числовые значения (смешанных типов), и возвращает сумму в виде значения long double. Помогите пожалуйста составить функцию или приведите пример шаблонной функции с переменными аргументами и образец ее вызова. Заранее спасибо. http://www.cyberforum.ru/cpp-beginners/thread1227230.html
Как научиться программированию на С++ C++
Как научиться программированию на С++, как за месяц более менее освоить этот язык.программирования.
C++ Как научиться программированию на С++
Как научиться программированию на С++, как за месяц более менее освоить этот язык программирования. В частности научиться создавать вирусы и другие программы.
C++ Объединение прямоугольников (количество объединенных прямоугольников минимально) http://www.cyberforum.ru/cpp-beginners/thread1227181.html
Добрый день. Прошу помощи в выполнении задачи. Дан список прямоугольников, которые задаются координатами верхней левой вершины и размерами (ширина, высота) (целые числа). Необходимо объединить пересекающиеся и соприкасающиеся прямоугольники таким образом, чтобы число полученных в результате объединения прямоугольников было минимально. Дополнительно приоритет желательно отдавать прямоугольникам,...
C++ Определить, является ли билет счастливым с помощью рекурсии Проверка является ли билет счастливым (123123 - ДА, 123124 - НЕТ) с использованием в решении рекурсии. Хватило только на простенькое решение... #include <stdio.h> #include <iostream> using namespace std; int main() { int number; подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
 Аватар для Mr.X
2804 / 1580 / 248
Регистрация: 03.05.2010
Сообщений: 3,683
15.07.2014, 12:34     Организация вызовов функций
Если вызываемых различных отрезков функций действительно много, то можно поместить эти функции в класс-оболочку, где установление соответствия между парами параметров и отрезками вызываемых функций можно сделать очень простым и наглядным:
C++
1
2
3
4
5
6
void    fill_indexes_for_types()
{
    indexes_for_types_[T_int_pair( 0,       0   )]    =   T_int_pair(0, 3);
    indexes_for_types_[T_int_pair( 100,     100 )]    =   T_int_pair(1, 3);
    indexes_for_types_[T_int_pair( 100,     300 )]    =   T_int_pair(1, 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
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/////////////////////////////////////////////////////////////////////////////////////////
//Есть функция foo(x, y, z, type1, type2), которая в свою очередь последовательно вызывает 
//другие функции внутри себя в зависимости от значений аргументов type1 и type2 . 
//
//В зависимости от аргументов type1 и type2 функции должны вызваться в разном порядке. 
//Проблема в том, что аргменты type1 и type2 могут принимать большое количество разных значений, 
//и соответственно количество комбинаций последовательностей вызова внутренних функций велико. 
//Поэтому через if'ы это делать неудобно, например:
//void foo(x, y, z, type1, type2)
//{
//  if (type1 == 0 && type2 == 0) { foo1(); foo2(); foo3(); foo4(); }
//  else if  (type1 == 100 && type2 == 100) { foo2(); foo3(); foo4(); }
//  else if  (type1 == 100 && type2 == 300) { foo2(); foo3(); }
//...
//}
//
//Вопрос: как правильно организовать такой поток обработки данных (определить, с какой 
//внутренней функции начать выполнение)?
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <utility>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
class   T_func_manager
{
    //-----------------------------------------------------------------------------------
    typedef std::pair       < int,              int         >   T_int_pair;
    typedef std::map        < T_int_pair,       T_int_pair  >   T_indexes_for_types;
    typedef void    (T_func_manager::*T_func_pointer)();
    typedef std::vector     < T_func_pointer    >               T_func_pointers;
    //-----------------------------------------------------------------------------------
    T_func_pointers         func_pointers_;
    T_indexes_for_types     indexes_for_types_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    T_func_manager()
    {
        fill_func_pointers      ();
        fill_indexes_for_types  ();
    }
    //-----------------------------------------------------------------------------------
    void    execute_with_types
        (
            int     type_first,
            int     type_second
        )
    {
        T_int_pair  indexes_pair    =   indexes_for_types_
                                            [
                                                T_int_pair( type_first, type_second )
                                            ];
 
        for_each
            (
                func_pointers_.begin() + indexes_pair.first,
                func_pointers_.begin() + indexes_pair.second + 1,
                *this
            );
    }
    //-----------------------------------------------------------------------------------
    void    operator() ( T_func_pointer     func_pointer )
    {
        ( this->*func_pointer )();
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    void    fill_func_pointers()
    {
        func_pointers_.push_back( &T_func_manager::foo1 );
        func_pointers_.push_back( &T_func_manager::foo2 );
        func_pointers_.push_back( &T_func_manager::foo3 );
        func_pointers_.push_back( &T_func_manager::foo4 );
    }
    //-----------------------------------------------------------------------------------
    void    fill_indexes_for_types()
    {
        indexes_for_types_[T_int_pair( 0,       0   )]    =   T_int_pair(0, 3);
        indexes_for_types_[T_int_pair( 100,     100 )]    =   T_int_pair(1, 3);
        indexes_for_types_[T_int_pair( 100,     300 )]    =   T_int_pair(1, 2);
    }
    //-----------------------------------------------------------------------------------
    void    foo1()
    {
        std::cout   <<  "foo1"
                    <<  std::endl;
    }
    //-----------------------------------------------------------------------------------
    void    foo2()
    {
        std::cout   <<  "foo2"
                    <<  std::endl;
    }
    //-----------------------------------------------------------------------------------
    void    foo3()
    {
        std::cout   <<  "foo3"
                    <<  std::endl;
    }
    //-----------------------------------------------------------------------------------
    void    foo4()
    {
        std::cout   <<  "foo4"
                    <<  std::endl;
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    T_func_manager  func_manager;
 
    func_manager.execute_with_types   ( 0,    0   );
    std::cout   <<  std::endl;
 
    func_manager.execute_with_types   ( 100,  100 );
    std::cout   <<  std::endl;
 
    func_manager.execute_with_types   ( 100,  300 );
 
    std::cin.sync();
    std::cin.get();
}
 
Текущее время: 19:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru