Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2013, 17:12   #1
Darthriddikc
Новичок
Джуниор
 
Регистрация: 23.10.2008
Сообщений: 1
Стрелка Вызов глобальной функции из объекта класса

Здравствуйте! Допустим, к примеру, имеется класс, который может хранить в себе адрес на функцию, а также метод, который вызовет эту функцию...
Код:
#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 Caller1(func1);
    Caller1.call();
    return 0;
}
Объекты данного класса могут хранить и вызывать только void функции, которые без параметров... Если я хочу, чтоб объект делал всё тоже самое, но, допустим, с функцией с 2-мя параметрами, да ещё и возвращающая int, то, в данном случае, я делаю указатель на int функцию c 2-мя параметрами, дописываю в класс 2 переменные в которых будут храниться значения параметров, переделываю конструктор соответствующим образом, а также вызов функции в методе...
И вот у меня вопрос, есть ли такая возможность реализовать этот класс, чтобы он был универсален и не зависим от количества параметров и типа возвращающего значения функции, которые ему пытаются "втюхать", то есть, чтобы не приходилось его переделывать под разные варианты?

Последний раз редактировалось Darthriddikc; 21.12.2013 в 17:20.
Darthriddikc вне форума Ответить с цитированием
Старый 21.12.2013, 18:48   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Самый простой способ - использовать variatic templates из C++11:
Код:
#include <functional>
#include <iostream>

class caller {
	std::function<void()> nextFunc;

public:
	template<class func, class... args>
	caller(const func &f, const args &...a)
		:nextFunc(std::bind(f, a...)) {}

	void call()
	{
		nextFunc();
	}
};

void func1()
{
	std::cout << "Void called!\n";
}

void func2(int a, int b)
{
	std::cout << "Func2: they called me with a=" <<  a << " and b=" << b << "\n";
}

int main()
{
	caller c1(func1);
	caller c2(func2, 5, 10);
	c1.call();
	c2.call();
}
Но со старыми компиляторами это не будет работать. Для них тоже есть стремные техники, в принципе, можешь погуглить про emulation of variatic templates.
Son Of Pain вне форума Ответить с цитированием
Старый 21.12.2013, 18:48   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Есть, но это упражнение не для слабонервных.
Почитайте про шаблон tuple...
waleri вне форума Ответить с цитированием
Старый 22.12.2013, 21:03   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Darthriddikc Посмотреть сообщение
И вот у меня вопрос, есть ли такая возможность реализовать этот класс, чтобы он был универсален и не зависим от количества параметров и типа возвращающего значения функции, которые ему пытаются "втюхать", то есть, чтобы не приходилось его переделывать под разные варианты?
Да. Такая возможность есть.

В рамках 2003 стандарта использовались перегрузки/специализации шаблонов.

В рамках 2011 стандарта используются variatic templates.

Подробности вы можете узнать исследовав коды:

std::tuple
std::function
std::bind
make_shared_ptr
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица+консольное меню(С++) Alexandr_Snorlax Помощь студентам 3 25.12.2011 17:21
консольное меню в pascal VaLenOK007 Помощь студентам 8 26.09.2011 20:08
Как создать консольное меню на Си DIIT Помощь студентам 1 01.12.2007 05:30