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

Сравнение std::function с необходимым каллбеком - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Выход за пределы массива http://www.cyberforum.ru/cpp-beginners/thread1774313.html
#include <assert.h> #include <assert.h> #include <string.h> #include <stdint.h> #include <limits.h> int get_bit(const void *in, size_t n) { return (((const uint8_t*)in) & (1 << (n % CHAR_BIT))) != 0; }
C++ Получить доступ к локальной переменной другой функции Что не так?Можно ли тут обойтись без указателя? #include <iostream> using namespace std; int a = 0; void m(void) { extern int b; a++; b++; } http://www.cyberforum.ru/cpp-beginners/thread1774304.html
Выделение и очистка динамической памяти C++
Добрый день. Никак не могу найти информацию по следующему вопросу. Допустим создаем динамический массив строк. char** mass=new char* for (int i=0;i<count;i++) { mass=new char ; }
C++ Препроцессор vs текст
Привет. Я баловался с директивами препроцессора и как-то задумал с помощью директивы #include вставить текст в char *. У меня вышло, я вставил текст типа "test!". test.txt: "test!" main.cpp: #include <iostream> constexpr char * line =
C++ Указатели и динамическая память http://www.cyberforum.ru/cpp-beginners/thread1774276.html
Здравствуйте. Почему размер памяти для указателя выделяется такой же как для объекта в куче. Например: int * pVar = new int;Как я понял, память для указателя выделяется в стеке, но тип (размер) должен совпадать с типом памяти выделяемой в куче. Если, например, объект myObj занимает много памяти, то память в стеке расходуется попусту т.к. она содержит только адрес объекта в куче. myObj * pVar =...
C++ Перенести все числа массива меньшие первого элемента в начало Выполните сортировку массива следующим образом. Все числа меньшие первого должны предшествовать этому первому числу, а все большие него идти за ним. Заранее спасибо. подробнее

Показать сообщение отдельно
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
01.07.2016, 18:55     Сравнение std::function с необходимым каллбеком
rikimaru2013, ну тогда что-то такое:
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
#include <iostream>
#include <functional>
#include <type_traits>
using namespace std;
 
//////////////////////////////////////////////////////////////////////////
class IFoo
{
public:
    virtual void onAppStarted(int, int) = 0;
};
//////////////////////////////////////////////////////////////////////////
 
template <typename T>
struct FunctionTypeDeduction : public FunctionTypeDeduction<decltype(&T::operator())>  
{};
//////////////////////////////////////////////////////////////////////////
 
template<class ClassType, class ReturnType, class... Args>
struct FunctionTypeDeduction< ReturnType(ClassType::*)(Args...) >
{
    using type = ReturnType(*)(Args...);
    using functorType = std::function<ReturnType(Args...) >;
};
//////////////////////////////////////////////////////////////////////////
 
template<class ClassType, class ReturnType, class... Args>
struct FunctionTypeDeduction< ReturnType(ClassType::*)(Args...) const> : FunctionTypeDeduction< ReturnType(ClassType::*)(Args...)>
{};
//////////////////////////////////////////////////////////////////////////
 
class SubcribeSystem
{
public:
    using tSomeMethodType = FunctionTypeDeduction< decltype(&IFoo::onAppStarted) >::type;
    using tSomeMethodCallback = FunctionTypeDeduction< decltype(&IFoo::onAppStarted) >::functorType;
 
public:
    void subribeOnSomeMethod(const tSomeMethodCallback& arr)
    {
        arr(3, 19);
    }
};
#define SUBCRIBE_FOR_SOMEMETHOD( eventsObj, lambda )                    \
    do                                                                  \
    {                                                                   \
        static_assert(is_same<SubcribeSystem::tSomeMethodType, FunctionTypeDeduction<decltype(lambda)>::type>::value, "bad type"); \
        SubcribeSystem::tSomeMethodCallback const func_ptr = lambda;    \
        eventsObj.subribeOnSomeMethod( lambda );                        \
    }                                                                   \
    while(false);                                                       
//////////////////////////////////////////////////////////////////////////
class Bar
{
public:
    void fn(SubcribeSystem& events)
    {
        auto onAppStart = [](int width, int height)
        {
            cout << width << " " << height << endl;
        };
        auto onAppStart2 = [](bool width, int height)
        {
            cout << width << " " << height << endl;
        };
        auto onAppStart3 = [this](int width, int height)
        {
            cout << width << " " << height << endl;
            someOtherMethod(width);
        };
        SUBCRIBE_FOR_SOMEMETHOD(events, onAppStart);      // expect ok    
        SUBCRIBE_FOR_SOMEMETHOD(events, onAppStart2);     // expect error
        SUBCRIBE_FOR_SOMEMETHOD(events, onAppStart3);     // expect ok
    }
    void someOtherMethod(int x)
    {
        cout << "processed callback " << x << endl;
    }
};
int main()
{
    Bar bar;
    SubcribeSystem sub;
    bar.fn(sub);
}
Как дедуцировать тип лямбды я честно нарыл в интернете...
 
Текущее время: 14:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru