Здравствуйте. Возникла довольно тривиальная задача, но никак не могу подобрать нужный и легковесный синтаксис для ее решения.
Допустим, у нас есть некоторый объект, у которого есть оператор () с какими-то аргументами или без них. Это может быть лямбда, 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.