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

Возвращаемое значение делигата - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ 2. Написать алгоритм, классифицирующий треугольники (остроугольные, прямоугольные, тупоугольные), если даны углы http://www.cyberforum.ru/cpp-beginners/thread984447.html
Написать алгоритм, классифицирующий треугольники (остроугольные, прямоугольные, тупоугольные), если даны углы.
C++ Объединение векторов Есть 2 вектора разной размерности vector1 и vector2, тип данных идентичен, как добавить vectror2 к vector1, в конец. Без использования циклов типа for и while, желательно максимально просто. http://www.cyberforum.ru/cpp-beginners/thread984438.html
поток всегда будет ждать завершения скрипта, выполняемого в system()? C++
Суть вопроса в теме. Есть такой код: int main() { string input; string start = "start", finish = "finish"; system("dmidecode > test.txt"); ifstream fin("test.txt");
C++ Проверить, что в натуральном числе встречаются цифры А и В.
Помогите пожалуйста решить задачу, буду весьма признателен. Проверить, что в натуральном числе встречаются цифры А и В.
C++ Зачетная работа http://www.cyberforum.ru/cpp-beginners/thread984396.html
#include <stdio.h> #include <stdlib.h> #include <conio.h.> #include <time.h> #define N 10 void vvod (int *mas); void vivod (int *mas); void sort (int *mas); int main () {
C++ Ошибка: ld returned 1 exit status Компилятор - Dev-c++, имеются три файла, electric train.h enum way {left, right}; enum halt {first, second, third, fourth, fifth, sixth} HALT; enum doors {open, close}; enum movement {go, stop}; class electric_train{ way curr_way; halt curr_stop; doors curr_doors; подробнее

Показать сообщение отдельно
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
22.10.2013, 12:57     Возвращаемое значение делигата
Сделал делигат, который принимает до 4-х аргументов функции, которая принимает любой из типой для возвращаемого значения.


Вот собственно файл Delegate.h

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
struct VOID{};
class IArgument {public: virtual  ~IArgument(){}};
 
template< class Arg1 = VOID, class Arg2 = VOID, 
          class Arg3 = VOID, class Arg4 = VOID  >
class Argument : public IArgument
{
public: 
    Argument() {}
    Argument(Arg1 arg) : arg1(arg) {}
    Argument(Arg1 _arg1, Arg1 _arg2) : arg1(_arg1), arg2(_arg2) {}
    Argument(Arg1 _arg1, Arg1 _arg2,Arg1 _arg3) : 
                arg1(_arg1), arg2(_arg2),arg3(_arg3) {}
    Argument(Arg1 _arg1, Arg1 _arg2,Arg1 _arg3, Arg1 _arg4) : 
                arg1(_arg1), arg2(_arg2),
                arg3(_arg3), arg4(_arg4) {}
 
    Arg1 arg1, arg2, arg3, arg4;
};
 
 
 
class IContainer {public: virtual void Call(IArgument*) {}};
 
template< class Obj, class Method>
class Container : public IContainer {};
 
//Для вызова без аргумента
template< class Obj, class Ret_Type>
class Container<Obj, Ret_Type (Obj::*)(void)> : public IContainer
{
public:
    typedef Ret_Type (Obj::*Method)(void);
    Container(Obj* v1, Method v2) : val1(v1), val2(v2) {}
 
    void Call(IArgument *arg)
    {
        (val1->*val2)();
    }
 
private:
    Obj *val1;
    Method val2;
};
 
//Для  одного аргумента
template< class Obj, class Ret_Type, class Arg1>
class Container<Obj, Ret_Type (Obj::*)(Arg1)> : public IContainer
{
public:
    typedef Argument<Arg1> Arg_type;
    typedef Ret_Type (Obj::*Method)(Arg1);
    Container(Obj* v1, Method v2) : val1(v1), val2(v2) {}
 
    void Call(IArgument *arg)
    {
        Arg_type* a = dynamic_cast< Arg_type* >( arg );
        (val1->*val2)(a->arg1);
    }
 
private:
    Obj *val1;
    Method val2;
};
 
//Для  двух  аргументов
template< class Obj, class Ret_Type, class Arg1, class Arg2>
class Container<Obj, Ret_Type (Obj::*)(Arg1, Arg2)> : public IContainer
{
public:
    typedef Argument<Arg1, Arg2> Arg_type;
    typedef Ret_Type (Obj::*Method)(Arg1, Arg2);
    Container(Obj* v1, Method v2) : val1(v1), val2(v2) {}
 
    void Call(IArgument *arg)
    {
        Arg_type* a = dynamic_cast< Arg_type* >(arg);
        (val1->*val2)(a->arg1, a->arg2);
    }
 
private:
    Obj *val1;
    Method val2;
};
 
//Для  трех  аргументов
template< class Obj, class Ret_Type, class Arg1, class Arg2, class Arg3>
class Container<Obj, Ret_Type (Obj::*)(Arg1, Arg2, Arg3)> : public IContainer
{
public:
    typedef Argument<Arg1, Arg2, Arg3> Arg_type;
    typedef Ret_Type (Obj::*Method)(Arg1, Arg2, Arg3);
    Container(Obj* v1, Method v2) : val1(v1), val2(v2) {}
 
    void Call(IArgument *arg)
    {
        Arg_type* a = dynamic_cast< Arg_type* >(arg);
        (val1->*val2)(a->arg1, a->arg2, a->arg3);
    }
 
private:
    Obj *val1;
    Method val2;
};
 
//Для  четырех аргументов
template< class Obj, class Ret_Type, class Arg1, class Arg2, class Arg3, class Arg4 >
class Container<Obj, Ret_Type (Obj::*)(Arg1, Arg2, Arg3, Arg4)> : public IContainer
{
public:
    typedef Argument<Arg1, Arg2, Arg3, Arg4> Arg_type;
    typedef Ret_Type (Obj::*Method)(Arg1, Arg2, Arg3, Arg4);
    Container(Obj* v1, Method v2) : val1(v1), val2(v2) {}
 
    void Call(IArgument *arg)
    {
        Arg_type* a = dynamic_cast< Arg_type* >(arg);
        (val1->*val2)(a->arg1, a->arg2, a->arg3, a->arg4);
    }
 
private:
    Obj *val1;
    Method val2;
};
 
 
class Delegate
{
public:
 
    template< class Obj, class Method >
    void Connect(Obj* val1, Method val2)
    {
        p_container = new Container<Obj, Method>(val1, val2);
    }
 
    void operator ()()
    {
        p_container->Call(&Argument<>());
    }
 
    template< class Arg1 >
    void operator ()(Arg1 arg1)
    {
        p_container->Call(& Argument<Arg1>(arg1) );
    }
 
    template< class Arg1, class Arg2 >
    void operator ()(Arg1 arg1, Arg2 arg2)
    {
        p_container->Call(& Argument<Arg1, Arg2>(arg1, arg2) );
    }
 
    template< class Arg1, class Arg2, class Arg3 >
    void operator ()(Arg1 arg1, Arg2 arg2, Arg3 arg3)
    {
        p_container->Call(& Argument<Arg1, Arg2, Arg3>(arg1, arg2, arg3) );
    }
 
    template< class Arg1, class Arg2, class Arg3, class Arg4 >
    void operator ()(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
    {
        p_container->Call(& Argument<Arg1, Arg2, Arg3, Arg4>(arg1, arg2, arg3, arg4) );
    }
 
private:
    IContainer *p_container;
};

Работаю я с ним вот так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include "Delegate.h"
using namespace std;
 
class Test
{
public:
    int f1() {return 5;}
};
 
int main()
{
    Test t1;
    IDelegate d1;
    d1.Connect(&t1, &Test::f1);
    d1();
    system("pause >void");
}
И собственно вопрос:

Я не пойму как мне вернуть значение функции f1 имеенно в точку d1(); в функции main.
Если я спокойно могу манипулировать этим значением в класса Container, то для того чтобы вернуть его из operator () мне нужно в классе Delegate как то его вытащить. Вот я и не знаю как.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru