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

Абстракция вызова функции - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него? http://www.cyberforum.ru/cpp-beginners/thread960880.html
Это указатель на класс figure *f Это перегрузка оператора void figure::operator (int i) { cout << "(" << massiv.x << "," << massiv.y << ")" << endl; } В нужный момент вызываю оператор, но пишет, что он без побочного эффекта, и ничего не выводит f
C++ Масив через рекурсию В упорядоченном массиве целых чисел ai, i = 1 ... n найти номер элемента "c" методом бинарного поиска, используя очевидное соотношение: если c<= an/2, тогда c є1...аn/2] , иначе c єn/2+1...an] . Если элемент c отсутствует в массиве, то вывести соответствующее сообщение. Решить двумя способами с рекурсией и без нее.. спасибо! http://www.cyberforum.ru/cpp-beginners/thread960854.html
Перегруженные шаблоны C++
Написать перегруженные шаблоны для решения уравнения: ax^2+bx+c=0
C++ Перегруженные функции
Написать перегруженную функцию, которая возвращает площадь квадрата, прямоугольника, треугольника и круга. Считать, что для вычисления площадей фигур заданы целые величины длин сторон, а для круга – еще и pi =3.1415926
C++ Создание перегруженных функций http://www.cyberforum.ru/cpp-beginners/thread960846.html
Написать перегруженную функцию, которая возвращает сумму двух целых чисел, трех целых чисел, двух слов
C++ Двухмерний Масив char Как на с++ описать динамический масив символов в таблицу? подробнее

Показать сообщение отдельно
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.09.2013, 01:36     Абстракция вызова функции
ну например
Кликните здесь для просмотра всего текста
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
#include <memory>
#include <iostream>
#include <functional>
 
template<class... Args>
class DelegateTemplate;
 
class Delegate
{
    std::unique_ptr<Delegate> mPtr;
public:
    virtual ~Delegate() { }
 
    template<class R, class T, class... Args>
    void RegisterFunction(R(*target)(Args...), T(*callback)(R), Args... args)
    {
        mPtr.reset(new DelegateTemplate<R(Args...), T(R)>(target, callback, args...));
    }
 
    template<class R, class S, class T, class... Args>
    void RegisterFunction(R(S::*target)(Args...), S* obj, T(*callback)(R), Args... args)
    {
        mPtr.reset(new DelegateTemplate<R(Args...), T(R)>(target, obj, callback, args...));
    }
 
    virtual void CallFunction()
    {
        mPtr->CallFunction();
    }
};
 
template<class R, class T, class... Args>
class DelegateTemplate<R(Args...), T(R)> : public Delegate
{
    std::function<R()> mTarget;
    std::function<T(R)> mCallback;
public:
    DelegateTemplate(R(*target)(Args...), T(*callback)(R), Args... args)
    : mTarget(std::bind(target, args...))
    , mCallback(callback)
    {
    }
 
    template<class S>
    DelegateTemplate(R(S::*target)(Args...), S* obj, T(*callback)(R), Args... args)
    : mTarget(std::bind(target, obj, args...))
    , mCallback(callback)
    {
    }
 
    ~DelegateTemplate() { }
 
    void CallFunction() override
    {
        mCallback(mTarget());
    }
};
 
int Foo1(int i)
{
    std::cout << "Foo1.i = " << i << std::endl;
    return i;
}
 
void Callback1(int i)
{
    std::cout << "Callback1.i = " << i << std::endl;
}
 
const char* Foo2(double r)
{
    std::cout << "Foo2.r = " << r << std::endl;
    return "hello world";
}
 
void Callback2(const char* str)
{
    std::cout << "Callback1.str = " << str << std::endl;
}
 
class Test
{
public:
    int Foo3(const char* str)
    {
        std::cout << "Test::Foo3.str = " << str << std::endl;
        return 4;
    }
};
 
int main()
{
    Delegate d;
    d.RegisterFunction(&Foo1, &Callback1, 42);
    d.CallFunction();
 
    
    double x = 500.100;
    d.RegisterFunction(&Foo2, &Callback2, x);
    d.CallFunction();
 
    Test test;
    d.RegisterFunction(&Test::Foo3, &test, Callback1, "hello from main");
    d.CallFunction();
}

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