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

Функция должна принять указатель на саму себя - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Хранение экземпляров классов-наследников, и вызов их методов http://www.cyberforum.ru/cpp-beginners/thread1065275.html
Столкнулся с проблемой. Есть класс-родитель и 2 класса-наследника. class Base { public: void baseFunc(); }; class Derived1 : public Base
C++ Получить все возможные варианты комплектов книг. Исправить код #include<iostream.h> using namespace std; int main() { int i=0, j=0, k=0, m=0; while(i<7) { http://www.cyberforum.ru/cpp-beginners/thread1065260.html
Определить структуру Модель Виндовс для работы с моделями экранных окон.В качестве полей задаются C++
Определить структуру Model Window для работы с моделями экранных окон.В качестве полей задаются:заголовок окна,координаты левого верхнего угла,размер по горизонтали,размер по вертикали,состояние "видимое/невидимое",состояние"с рамкой/без рамки".Координаты и размеры указываются в целых числах.Кроме функций read и print реализовать следующие функции:передвижение окна по горизонтали,по...
C++ Найти уравнение прямой, проходящей через точку А
Найти уравнеие прямой (в форме альфа*x+бета*y+гамма=0),проходящей через точку А(X1,Y1) перпендикулярно к прямой ax+by+c=0. Пожалуйста помогите написать программу.
C++ Узнать какая кнопка была нажата SDL2.0 http://www.cyberforum.ru/cpp-beginners/thread1065234.html
Привет, как в этом примере узнать какая кнопка была нажата, я хочу сделать для каждой кнопки отдельное действия, но не могу понять, как узнать какая кнопка была нажата Код: /*This source code copyrighted by Lazy Foo' Productions (2004-2013) and may not be redistributed without written permission.*/ //Using SDL, SDL_image, standard IO, and strings #include <SDL.h> #include <SDL_image.h>
C++ Определить, можно ли представить число в виде суммы двух квадратов натуральных чисел Дано натуральное число n.Определить,можно ли представить его в виде суммы двух квадратов натуральных чисел.Если да,то найти все пары x,y такие,что n=x^2+y^2 (x<=y). Очень нужна ваша помощь,помогите пожалуйста. подробнее

Показать сообщение отдельно
hoggy
6461 / 2659 / 460
Регистрация: 15.11.2014
Сообщений: 5,850
Завершенные тесты: 1
21.09.2015, 22:11     Функция должна принять указатель на саму себя
Цитата Сообщение от daslex Посмотреть сообщение
На базовом понимаю. Зачем они нужны тоже понимаю. Однозначно знаю не всю подноготную, но малая, вводная часть о шаблонах мне известна. Что Вы понимаете под базовым уровнем не очень понимаю. Понятие базовых знаний у людей обычно отличается. Как они там делают "большое пузо" небольшим с виду кодам, например, плохо понимаю, только в общих чертах.
тогда поехали:

для начала отвлечемся от вашей задачи.
забудье на время обо всем, о чем мы с вами говорили прежде.
начнем с чистого листа.

предположим, есть неккий класс "кнопка".
и если на кнопку нажали - пусть она предупредит наш клиентский код об этом событии.

но проблема в том, что "кнопка" - это библиотечный класс, который ничего о нас не знает
как же она сможет прудепредить нас о нажатии, если она ничего о нас не знает?

и вот здесь на помощь приходят "делегаты" - механизмы,
которые позволяют выполнить опосредованный вызов произвольной функции,
или функции-члена,
без необходимости знать, что именно будет вызванно.


вот так это может выглядеть в коде:

http://rextester.com/TSIWEX43141

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
#include <iostream>
#include <functional>
 
struct button
{
 
    typedef std::function<void()>
        callback;
    
    
    callback onPressed;
    
    
    void simulatePressed()
    {
        if(onPressed)
            onPressed();
    }
};
 
 
void if_pressed()
{
    std::cout<<"на кнопку нажали\n"; 
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    button b;
    b.onPressed = if_pressed;
    
    
    b.simulatePressed();
}
кнопка ничего о нас не знает.
но мы указали ей, что нужно дернуть,
что бы нас предупредить.


теперь следущий шаг:
вы наверное уже заметили,
что всю грязную работу на себя берет чудесный механизм std::function.

как он это делает?

концептуальная схема:
http://rextester.com/QXLF72730


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
#include <iostream>
 
 
// --- будем запускать её
int foo() { std::cout<< __PRETTY_FUNCTION__ << std::endl; return 0; }
 
 
// --- общий шаблон - не функционирует
// попытка вызвать его для абы какого T будет приводить
// к ошибкам компиляции
template<class T>struct delegate;
 
    
// --- специализация для случая, когда делегат
// это функция    
template<class R, class... Args>
struct delegate<R(Args...)>
{
    // из шаблона выводится тип функции
    // которую нужно запустить.
    typedef R(*pFunc)(Args...);
    
    
    // --- нацеливание делегата в конструкторе
    delegate( R foo(Args...)  )
        :mFunc(foo) 
    {} 
    
    R operator ()(Args&&... args)
    {
        // -- запуск функции
        return  mFunc( std::forward<Args>(args)...  );
    }
    
    pFunc mFunc;
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
 
    
    // --- создаем делегат,
    // который нацелен на запуск функции foo
    delegate<int()> d = foo;
    
    // запускаем функцию foo опосредованно,
    // через делегат
    d();
}
в реальности делегаты учитывают множество самых различных нюансов,
что позволяет нацелить их куда угодно.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru