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

Делегат на C++03 - C++

Восстановить пароль Регистрация
 
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.01.2013, 21:21     Делегат на C++03 #1
Сойдет за простейшую реализацию делегата?
Файл Delegate.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
 
class Delegate
{
    std::vector<void(*)()> farr;
public:
    Delegate  ();
    ~Delegate ();
 
    bool operator()(void);
    bool operator +=(void (*pf)());
    bool operator -=(void (*pf)());
};
Файл Delegate.cpp:
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
#include "Delegate.h"
 
Delegate:: Delegate () {}
Delegate::~Delegate () {}
bool Delegate::operator()(void)
{
    bool ret_val = false;
    try
    {
        for (std::vector<void(*)()>::const_iterator curr_it = farr.begin(); curr_it != farr.end(); ++curr_it)
        {
            (*curr_it)();
        }
    }
    catch (...)
    {
        ret_val = true;
    }
    return ret_val;
}
bool Delegate::operator +=(void (*pf)())
{
    bool ret_val = false;
    try
    {
        farr.push_back(pf);
    }
    catch (...)
    {
        ret_val = true;
    }
    return ret_val;
}
bool Delegate::operator -=(void (*pf)())
{
    bool ret_val = false;
    try
    {
        for (std::vector<void(*)()>::iterator curr_it = farr.begin(); curr_it != farr.end(); ++curr_it)
        {
            if ((*curr_it) == pf)
            {
                farr.erase(curr_it);
                break;
            }
        }
    }
    catch (...)
    {
        ret_val = true;
    }
    return ret_val;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2013, 21:21     Делегат на C++03
Посмотрите здесь:

C# Сортировка через делегат
C++ Qt Как применить делегат
Правильно вернуть делегат C#
Java try/finally и делегат
Обобщенный делегат C#
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
05.01.2013, 22:14     Делегат на C++03 #2
C++ (Qt)
1
2
bool operator +=(void (*pf)());
bool operator -=(void (*pf)())
Здесь ты меняешь смысл операций += и -=; Все ожидают, что эти операции будут возвращать модифицированный объект.
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.01.2013, 22:27  [ТС]     Делегат на C++03 #3
Dmitriy_M, неоспоримо конечно, но сделано было со злым умыслом на то, что писать
C++
1
(foo.onClick += Event1) += Event2;
никто не будет, хотя вполне вероятно что я заблуждаюсь в чем-либо - поэтому и создал тему)
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
06.01.2013, 01:35     Делегат на C++03 #4
Цитата Сообщение от Whiteha Посмотреть сообщение
никто не будет
Один из законов Мерфи: Все что можно сделать не так, обязательно будет кем-то сделано.
Удаление из std::vector довольно дорогая операция. Используй std::list, у него есть метод remove удаляющий по значению.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.01.2013, 10:29     Делегат на C++03 #5
Только это скорее какой-то event listener :\ Да и аргумент бы не помешал, хоть один. И методы объектов с помощью этой штуки не вызвать.
Yandex
Объявления
06.01.2013, 10:29     Делегат на C++03
Ответ Создать тему
Опции темы

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