Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Darthriddikc
10 / 10 / 2
Регистрация: 23.12.2012
Сообщений: 45
1

Вызов глобальной функции из объекта класса

20.12.2013, 22:37. Просмотров 732. Ответов 3
Метки нет (Все метки)

Здравствуйте! Допустим, к примеру, имеется класс, который может хранить в себе адрес на функцию, а также метод который "запустит" эту функцию...
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
#include <iostream>
 
typedef void (*NEXT_Act)();
 
class RunFunc{
    NEXT_Act nextAct;
public:
    RunFunc(NEXT_Act next){
        nextAct=next;
    }
    void start(){
        nextAct();
    }
};
 
void func1(){
    std::cout<<"!!!QwErTy!!!"<<std::endl;
}
 
int main(){
    RunFunc obj1(func1);
    obj1.start();
    return 0;
}
Объекты данного класса могут хранить и выполнять только void функции, которые без параметров... Если я хочу, чтоб объект делал всё тоже самое, но, допустим, с функцией с 2-мя параметрами, да ещё и возвращающая int, то, в данном случае, я делаю указатель на int функцию c 2-мя параметрами, дописываю в класс 2 переменные в которых будут храниться значения параметров, переделываю конструктор соответствующим образом, а также вызов функции в методе...
И вот у меня вопрос, есть ли такая возможность реализовать этот класс, чтобы он был универсален и не зависим от количества параметров и типа возвращающего значения функции, которые ему пытаются "впарить", то есть, чтобы не приходилось его переделывать под разные варианты?

Не по теме:

Лично я, никак не нахожу такую возможность... но я могу что-то упускать (иногда подчас что-то лежащее на поверхности :)), и вот решил всё-таки спросить

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 22:37
Ответы с готовыми решениями:

Вызов функции с не заданными параметрами из объекта класса
Пишу небольшое API, для себя. Сделал следующие: программист указывает объекту класса, имя пакета и...

Объявление класса, создание объекта и вызов функции-члена
Всем добрый день! Вот так я объявляю класс. typedef map&lt;string, double&gt; datablock; typedef...

Вызов константной функции для неконстантного объекта класса
Доброго дня! Имея класс с двумя перегруженными на основании константности функциями членами, каким...

Возможно ли создание объекта шаблонного класса в функции этого класса?
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон...

ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса
Здравствуйте! Столкнулся с такой проблемой: если есть родительский класс с конструктором, то при...

3
Убежденный
Ушел с форума
Эксперт С++
16149 / 7296 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
20.12.2013, 23:49 2
Можно нечто подобное сделать, используя C++11 и Boost.Bind.

Например:
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
#include <stdio.h>
#include <boost/bind.hpp>
 
 
 
// Функция с двумя параметрами.
 
int TwoArgsFunction(char const *pArg1, char const *pArg2)
{
    return (printf("%s, %s!\r\n", pArg1, pArg2));
}
 
 
 
// Функция с тремя параметрами.
 
bool ThreeArgsFunction(int Arg1, int Arg2, int Arg3)
{
    printf("%d + %d + %d = %d\r\n", Arg1, Arg2, Arg3, Arg1 + Arg2 + Arg3);
    return true;
}
 
 
 
// Класс, который будет вызывать функции по запросу.
 
template <typename T>
struct caller
{
    caller(T t) : m_t(t) {}
    void call() { m_t(); }
    T m_t;
};
 
 
 
// Функция для создания объектов "caller" (чтобы не нужно
// было указывать точный тип шаблонного параметра).
 
template <typename T>
caller<T> create_caller(T t) { return (caller<T>(t)); }
 
 
 
int main()
{
    auto Caller1 = create_caller(boost::bind(TwoArgsFunction, "Hello", "World"));
    auto Caller2 = create_caller(boost::bind(ThreeArgsFunction, 100, 200, 300));
 
    Caller1.call();
    Caller2.call();
 
    return 0;
}
Вывод:
> Hello, World !
> 100 + 200 + 300 = 600
1
Darthriddikc
10 / 10 / 2
Регистрация: 23.12.2012
Сообщений: 45
21.12.2013, 00:21  [ТС] 3
Убежденный, спасибо, получается, что здесь можно, только с помощью библиотек boost'а
0
Убежденный
Ушел с форума
Эксперт С++
16149 / 7296 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
21.12.2013, 00:28 4
Не обязательно, наверняка есть и другие способы.
Например, стоит (для расширения кругозора) попробовать
сделать то же самое на variadic templates, std::tuple, va_arg.
Или даже на макросах...
1
21.12.2013, 00:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2013, 00:28

Вызов функции из класса
есть функция объявленная в классе Calendar void calendar::menu_k() { cout&lt;&lt;&quot;\n\n&quot;;...

Вызов функции класса по каллбеку
Хочу реализовать возможность вызова метода класса по каллбеку. Сделал такой класс: class ICallable...

Вызов функции по указателю из класса
Такой расклад. Допустим имеем код: #include &lt;iostream&gt; using namespace std; template &lt;class...


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

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

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