С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 8

Вызов функции-члена через std::function

27.03.2016, 16:18. Показов 1464. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть в следующем

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

Для этого используется класс:

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
template <class T,typename FunctionType,typename... FuncArgs > class PWrapper {
 
    typedef FunctionType (T::*FT)(FuncArgs...);
 
public:
    PThreadWrapper(T* cls, FT Function,FuncArgs... args);
    void run_();    
private:
    
    std::function<FunctionType (T&,FuncArgs...)> _fp1;
    std::function<FunctionType(T&)> _fp2;
    T* _class;
};
 
 
template <class T,typename FunctionType,typename... FuncArgs> PThreadWrapper<T,FunctionType,FuncArgs...>::PThreadWrapper(T* cls,FT Function,FuncArgs... args):_class(cls)
{
    /*_fp1 = std::bind(Function, args...); // здесь ошибка No vaible overloaded '='*/
       _fp1(Function); //так работают только методы без параметров типа FunctionType (T::*)() 
}
 
template <class T,typename FunctionType,typename... FuncArgs> void PThreadWrapper<T,FunctionType,FuncArgs...>::run_()
{
    _fp1(*_class);
    return 0;
}
Функции типа FunctionType (T:: )() запускаются. А вот запуск с параметрами не могу победить, пишет "No matching function for call to object of type ...(тут тип в зависимости от того что вызывается)..." Второй день бьюсь... Что можно сделать или что почитать по такой задаче...

Через std::bind видел в этой теме std::bind. Но не работает, к сожалению (см. закоментированную строчку выше).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2016, 16:18
Ответы с готовыми решениями:

Вызов const метод std::function
Добрый день, #include &lt;functional&gt; #include &lt;string&gt; #include &lt;iostream&gt; using namespace std; class Foo { ...

Передача std::wstring как параметра функции-члена
IDE VS 2015. В солюшене 2 проекта. В одном из проектов класс примерно такой: class Messager{ void message(std::wstring msg)...

рекурсивный вызов функции-члена
как осуществить рекурсивный вызов функции члена?

2
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
27.03.2016, 18:09
Цитата Сообщение от Giena Посмотреть сообщение
Второй день бьюсь...
Очень много вторичных ошибок. Хорошо бы привести сперва все в порядок, потом решать основную проблему.
Над форматированием тоже нужно поработать, фигачить все в одну строку - это ужасно.
Почему параметр называется FunctionType, хотя по факту - это возвращаемое значение?
В общем, этому коду нужна дисциплина.

Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <functional>
 
template <class T, typename R, typename... FuncArgs> 
class PWrapper 
{
    typedef R (T::* FT)(FuncArgs...);
 
public:
    PWrapper(T * cls, FT func, FuncArgs... args);
    R run_();
    
private:
    std::function<R(T &)> _fp1;
    
    T * _class;
};
 
 
template <class T, typename R, typename... FuncArgs> 
PWrapper<T, R, FuncArgs...>::PWrapper(T * cls, FT func, FuncArgs... args) 
    : _fp1(std::bind(func, std::placeholders::_1, args...))
    , _class(cls)
{ }
 
template <class T, typename R, typename... FuncArgs> 
R PWrapper<T, R, FuncArgs...>::run_()
{
    return _fp1(*_class);
}
 
struct A 
{
    int test(int) 
    { 
        std::cout << "test(int)\n";
        return 0; 
    }
};
 
int main()
{
    A a;
    
    PWrapper<A, int, int> pwrap(&a, &A::test, 1);
    
    pwrap.run_();
}
http://rextester.com/UPWG40823
2
27.03.2016, 18:58

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
этому коду нужна дисциплина
"This code needs a code".

Прямо каламбур-афоризм.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2016, 18:58
Помогаю со студенческими работами здесь

Уточнения сигнатуры функции для std::function
Добрый день, как в таких случаях уточнить какую именно перегрузку функции random я передаю в std::function ? #include...

Std::function для хранения функции класса
class test { public: test() { f = display5; //Как правильно написать? } void setFunction(function&lt;void()&gt; func) ...

Вызов функции-члена элементов списка
Вот есть список, хранящий указатели (на экземпляры классов). Можно ли в нем реализовать подобную функцию?, вызывая которую, мы будем...

Вызов функции члена в заданом диапазоне
Нужно описать класс, в котором значение функции будет вычисляться в заданном диапазоне. Ну, допустим, есть функция: if (x &lt; 0)...

Вызов функции-члена класса по адресу в памяти
Всем хорошего дня :) Допустим, что где-то есть static функция, не принимающая аргументов и ничего не возвращающая. Имея один лишь...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru