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

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

Восстановить пароль Регистрация
 
Elimination
Сообщений: n/a
14.07.2014, 17:45     Организация вызовов функций #1
Добрый день!
У меня следующий вопрос. Есть функция foo(x, y, z, type1, type2), которая в свою очередь последовательно вызывает другие функции внутри себя в зависимости от значений аргументов type1 и type2 . Визуально это можно представить так:

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

В зависимости от аргументов type1 и type2 функции должны вызваться в разном порядке. Проблема в том, что аргменты type1 и type2 могут принимать большое количество разных значений, и соответственно количество комбинаций последовательностей вызова внутренних функций велико. Поэтому через if'ы это делать неудобно, например:
C++
1
2
3
4
5
6
7
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(); }
...
}
Вопрос: как правильно организовать такой поток обработки данных (определить, с какой внутренней функции начать выполнение)?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Riddleman
1 / 1 / 4
Регистрация: 03.03.2013
Сообщений: 49
14.07.2014, 17:49     Организация вызовов функций #2
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(type1)
{
 
case 100 : 
   switch(type2)
   {
    case 100://код бла бла
    break;
    case 200://код бла бла
    break;
   }
break;
case 200 ://код бла бла
break;
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
15.07.2014, 12:34     Организация вызовов функций #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если вызываемых различных отрезков функций действительно много, то можно поместить эти функции в класс-оболочку, где установление соответствия между парами параметров и отрезками вызываемых функций можно сделать очень простым и наглядным:
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();
}
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
15.07.2014, 12:38     Организация вызовов функций #4
Похоже на конечный автомат. Попробуй boost state machine посмотри
Yandex
Объявления
15.07.2014, 12:38     Организация вызовов функций
Ответ Создать тему
Опции темы

Текущее время: 10:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru