Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
2539 / 1198 / 358
Регистрация: 30.11.2013
Сообщений: 3,819
1

Сигнатура std::function и прототип метода

17.11.2015, 00:39. Просмотров 1333. Ответов 5
Метки нет (Все метки)

Добрый вечер,

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
#include <functional>
#include <string>
#include <iostream>
using namespace std;
 
class A
{
public:
    int foo(float, string){ return 77; }
};
 
class B
{
private:
    std::function<int(float, string)> m_call;   
    // есть ли способ автоматизировать взятия типа параметров и типа возвращаемого значения автоматически.
    // изменение в точки А или B - заставляет менять и в другом месте.
    // а так как есть рекомендация "если для изменения чего-либо надо поменять в двух местах - ваш код гавно".
    // 
    // моя фантазия упёрлась в интерфейс с public typedef std::function<int(float, string)> tCallback; - 
    // но сигнатуру метода надо изменять руками
 
public:
    B(A* obj)
    {
        m_call = std::bind(&A::foo, obj, std::placeholders::_1, std::placeholders::_2);
        cout << m_call(3.154, "privet") << endl;        
    }
};
int main()
{
    A* a = new A();
    B* b = new B(a);
}
 Комментарий модератора 

Оставлю и я свой комментарий. Задавайте вопрос и приводите код раздельно. Это существенно повысит шансы, что вас правильно поймут.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2015, 00:39
Ответы с готовыми решениями:

Странная сигнатура std::align
Есть в стандартной библиотеке функция std::align. Принимает на вход указатель на хранилище, размер...

Какая реализация лучше? std::pointer_to_binary_function vs std::function
Какая реализация (set_p или set_f) лучше /современнее / эффективнее ? pointer_to_binary_function в...

Использование std::function в std::thread
Нужно вызвать function fnc в новом потоке. Как сделать? function &lt;void(vector&lt;char&gt;)&gt; fnc; void...

Прототип на основе std::list
Вот создаю прототип на основе std::list он необходим для объектов, часть из которых активна, а...

5
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
17.11.2015, 00:49 2
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

http://rextester.com/ICUKOZ87439


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
#include <functional>
#include <string>
#include <iostream>
using namespace std;
 
class A
{
public:
    int foo(float, string){ return 77; }
};
 
template<class T> struct help;
    
template<class A, class R, class... Args> 
struct help<R (A::*)(Args...)>
{
    typedef std::function<R(Args...)> 
        type;
};
 
 
class B
{
    typedef help< decltype(&A::foo) >::type
        caller;
    
    caller m_call;
public:
    B(A* obj)
    {
        m_call = std::bind(&A::foo, obj, std::placeholders::_1, std::placeholders::_2);
        cout << m_call(3.154, "privet") << endl;        
    }
};
int main()
{
    A* a = new A();
    B* b = new B(a);
}
1
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
17.11.2015, 01:13 3
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

а можна ещё вот так:

http://rextester.com/YHUO8640

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
#include <string>
#include <iostream>
#include <functional>
using namespace std;
 
class A
{
public:
    int foo(float, string){ return 77; }
};
 
template<class T> struct help;
    
template<class A, class R, class... Args> 
struct help<R (A::*)(Args...)>
{
    typedef std::function<R(Args...)> 
        type;
    
    template<class Fn, Fn f>  //<--- указатель на функцию-член пробрасываем прямо в шапке шаблона
    static type init(A& obj)             // тогда не придется делать это через аргументы функции
    {                               // что в общем случае является более эффективным
        
        const auto lambda =  [obj](Args... args) mutable
        { 
            return (obj.*f)( std::forward<Args>(args)... ); 
        };  
        return lambda;
    }
};
 
 
class B
{
    typedef help< decltype(&A::foo) >
        helper;
    
    typedef helper::type
        caller;
    
    // автоматически определяем тип делегата
    caller m_call;
public:
    
    // можно так
    B(A* obj)
    {
        // автоматически биндим объект класса с его функцией-членом
        m_call = helper::init< decltype(&A::foo), &A::foo>(*obj);
        
        // только сам запуск придется править,
        // при изменении возможных сигнатур
        cout << m_call(3.154, "privet") << endl;        
    }
};
 
int main()
{
    A* a = new A();
    B* b = new B(a);
}
Добавлено через 5 минут
Цитата Сообщение от castaway Посмотреть сообщение
Это нынче мода такая пошла? Один непонятно спрашивает, а второй непонятно отвечает?
Или сговорились?
господин rikimaru2013 интересуется,
можно ли каким то образом довести код до полной нечитабельности так извернуться,
что бы вместо ручной правки в двух местах двух простеньких строчек кода
аццкий говнокод вундервафля на шаблонах делала бы это для него автоматически.
1
Эксперт С++
4966 / 3072 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
17.11.2015, 01:18 4
rikimaru2013, просто совет, - задавай вопрос в теме, а не в комментариях кода.
0
2539 / 1198 / 358
Регистрация: 30.11.2013
Сообщений: 3,819
17.11.2015, 01:19  [ТС] 5
Цитата Сообщение от hoggy Посмотреть сообщение
интересуется
ну что прям так сразу и жжёстко) Ваш код-макрос friend iostream для класса - тоже не бог читабельности, но один раз написали и используем везде.

Почему бы и мне этот код не загнать в сниппеты как CallbackType, CallbackDeductionHelper
1
Эксперт С++
8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
17.11.2015, 01:29 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Ваш код-макрос friend iostream для класса - тоже не бог читабельности, но один раз написали и используем везде.
ну дык... я его потому под макрос и упрятал, что бы не видеть этой мерзости

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Почему бы и мне этот код не загнать в сниппеты как CallbackType, CallbackDeductionHelper
вполне годно, если этим потом удобно будет пользоваться.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2015, 01:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

прототип метода
помогите разобраться пожалуйста class one { public: int var; void metod(void); }; void...

Std::function and std::vector
Как положить обёртки в вектор? Не используя библиотеку boost. function&lt;void(int)&gt; first_func() =...

Прототип метода, возвращающего объект класса
Вобщем проблема смешная впринципе. То ли меня уже коротит с этой темой но никак не могу понять что...

Проблема с заданием шаблона метода с параметром const std::function<T()>
Доброго времени суток! Ткните пожалуйста носом, что не так с заданием шаблона? Компилятор ругается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.