Как обернуть произвольный функтор на С++11?
От: Went  
Дата: 29.08.17 13:23
Оценка:
Здравствуйте. Возникла довольно тривиальная задача, но никак не могу подобрать нужный и легковесный синтаксис для ее решения.
Допустим, у нас есть некоторый объект, у которого есть оператор () с какими-то аргументами или без них. Это может быть лямбда, bind или что-то пользовательское.
auto fnc = [](int x){return x * x;};

Например, такой. Мне нужно написать универсальную функцию, которая будет принимать на вход любой подобный функтор и выдавать на выход функтор с подобной сигнатурой вызова, но который будет делать нечто (не важно что) с переданным на вход функтором. То есть:
auto wrap_fnc = wrap(fnc);
wrap_fnc(5);

Например, эта функция будет генерить функтор-обертку, который будет класть исходный функтор в список, прибиндив к нему те аргументы, которые были переданы при вызове обертки:
// псевдокод:
std::vector<std::function<void()>> global_array;
wrap(fnc)
{
  return [fnc](args...)
  {
    global_array.push_back([fnc, args...](){fnc(args...)});
  }
}

Кручу-верчу, но никак не могу определиться даже с тем, каким шаблоном должна быть функция wrap.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.