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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
LORF
Сообщения: 1
Зарегистрирован: 22 дек 2013, 18:22

Здравствуйте! Допустим, к примеру, имеется класс, который может хранить в себе адрес на функцию, а также метод, который вызовет эту функцию...

Код: Выделить всё

#include <iostream>
 
typedef void (*NEXT_Func)();
 
class caller{
    NEXT_Func nextFunc;
public:
    caller(NEXT_Func next){
        nextFunc=next;
    }
    void call(){
        nextFunc();
    }
};
 
void func1(){
    std::cout<<"!!!QwErTy!!!"<<std::endl;
}
 
int main(){
    caller c1(func1);
    c1.call();
    return 0;
}
Объекты данного класса могут хранить и вызывать только void функции, которые без параметров... Если я хочу, чтоб объект делал всё тоже самое, но, допустим, с функцией с 2-мя параметрами, да ещё и возвращающая int, то, в данном случае, я делаю указатель на int функцию c 2-мя параметрами, дописываю в класс 2 переменные в которых будут храниться значения параметров, переделываю конструктор соответствующим образом, а также вызов функции в методе...
И вот у меня вопрос, есть ли такая возможность реализовать этот класс, чтобы он был универсален и не зависим от количества параметров и типа возвращающего значения функции, которые ему пытаются "втюхать", то есть, чтобы не приходилось его переделывать под разные варианты?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну начнём с того, что единственный вариант, который позволит снять все ограничения с вызова метода call, это использование ... (va_arg аргумента). Если мы делаем неопределённый список параметров, то и инкапсулированная функция должна принимать неопределнный список параметров. Если этот вариант нам подходит, то выход найден. Если же не подходит, и инкапсулированная функция (точнее указатель на неё) должна иметь строгий список параметров, то о никакой универсальности не может идти и речи. Можно придумать несколько неуниверсальных вариантов (множественную перегрузку call, определение внтури call нужного варианта функции через дополнительные маркеры va_arg), но все они не будут универсальными, так как в тот момент, когда мы захотим через наш класс вызывать новый тип функций, класс всё равно придётся дописывать.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А что за загадочный "адрес на"? Адрес слова "на"? Или есть некий union, в один член которого записан код функции, а потом в другой поверх этого кода записан адрес фиг знает чего?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить