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

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

Восстановить пароль Регистрация
 
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
20.12.2013, 22:37     Вызов глобальной функции из объекта класса #1
Здравствуйте! Допустим, к примеру, имеется класс, который может хранить в себе адрес на функцию, а также метод который "запустит" эту функцию...
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 переменные в которых будут храниться значения параметров, переделываю конструктор соответствующим образом, а также вызов функции в методе...
И вот у меня вопрос, есть ли такая возможность реализовать этот класс, чтобы он был универсален и не зависим от количества параметров и типа возвращающего значения функции, которые ему пытаются "впарить", то есть, чтобы не приходилось его переделывать под разные варианты?

Не по теме:

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14209 / 6224 / 987
Регистрация: 02.05.2013
Сообщений: 10,368
Завершенные тесты: 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
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
21.12.2013, 00:21  [ТС]     Вызов глобальной функции из объекта класса #3
Убежденный, спасибо, получается, что здесь можно, только с помощью библиотек boost'а
Убежденный
Системный программист
 Аватар для Убежденный
14209 / 6224 / 987
Регистрация: 02.05.2013
Сообщений: 10,368
Завершенные тесты: 1
21.12.2013, 00:28     Вызов глобальной функции из объекта класса #4
Не обязательно, наверняка есть и другие способы.
Например, стоит (для расширения кругозора) попробовать
сделать то же самое на variadic templates, std::tuple, va_arg.
Или даже на макросах...
Yandex
Объявления
21.12.2013, 00:28     Вызов глобальной функции из объекта класса
Ответ Создать тему
Опции темы

Текущее время: 05:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru