std :: tr1 :: function - хранить функциональные объекты различных типов в общем контейнере - PullRequest
1 голос
/ 02 марта 2012

Я конвертирую свою реализацию функтора в std::tr1::function (причина в том, что в моей реализации нам нужно предварительно определить тип и класс функтора для каждого типа функции, я хочу расширить это для работы с любой функцией).

У меня есть

int param = 1;
std::tr1::bind (&MyClass::func, param);

и я хочу добавить это к некоторому общему контейнеру

someContainer.insert (std::tr1::bind (&MyClass::func, param));

Итак, как объявить контейнер, какого типа он должен принимать функцию любого типа? Возможно ли это вообще?

Второй вопрос - как вызывать функции в контейнере, например:

someContainer.begin().invoke();

P.S. Может быть, есть другое решение, я не достаточно осведомлен в этой теме. Был бы благодарен за ответы.

Я имею дело с GNU C ++ 98.

1 Ответ

1 голос
/ 31 мая 2012

Если под «любым типом» вы подразумеваете все функциональные объекты (функторы), имеющие одинаковую сигнатуру, то это просто:

std::vector< std::tr1::function<void()> >  someContainer;

Это создаст вектор любых функциональных объектов, который не принимает параметров и возвращаетvoid.

Чтобы вызвать функцию, просто вызовите ее как обычный объект функции:

(*someContainer.begin()) ();
...