#include <iostream>
#include <functional>
int foo(int i)
{
return i*2;
}
template <typename Ax, typename R, typename... A>
struct Wrap
{
typedef R (*F)(A...);
typedef std::function<R(A...)> Ftor;
Wrap(F f) : _f(f) { }
Wrap(const Ftor& f) : _f(f) { }
R operator()(Ax extra, A... a) const
{ return _f(a...); /*just forward*/ }
Ftor _f;
};
template <typename Ax=int, typename R, typename... A>
std::function<R(Ax, A...)> wrap(R (f)(A...))
{
return Wrap<Ax,R,A...>(f);
}
template <typename Ax=int, typename R, typename... A>
std::function<R(Ax, A...)> wrap(std::function<R(A...)> functor)
{
return Wrap<Ax,R,A...>(functor);
}
int main(int argc, const char *argv[])
{
auto bar = wrap(foo);
std::function<int(int, int)> barfunc = wrap(foo);
std::cout << barfunc(-999, 21) << std::endl;
// wrap the barfunc?
auto rewrap = wrap(barfunc);
std::cout << rewrap(-999, -999, 21) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmludCBmb28oaW50IGkpCnsKICAgIHJldHVybiBpKjI7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBBeCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQT4Kc3RydWN0IFdyYXAKewogICAgdHlwZWRlZiBSICgqRikoQS4uLik7CiAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248UihBLi4uKT4gRnRvcjsKCiAgICBXcmFwKEYgZikgOiBfZihmKSB7IH0KICAgIFdyYXAoY29uc3QgRnRvciYgZikgOiBfZihmKSB7IH0KCiAgICBSIG9wZXJhdG9yKCkoQXggZXh0cmEsIEEuLi4gYSkgY29uc3QKICAgIHsgcmV0dXJuIF9mKGEuLi4pOyAvKmp1c3QgZm9yd2FyZCovIH0KCiAgICBGdG9yIF9mOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEF4PWludCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQT4Kc3RkOjpmdW5jdGlvbjxSKEF4LCBBLi4uKT4gd3JhcChSIChmKShBLi4uKSkKewogICAgcmV0dXJuIFdyYXA8QXgsUixBLi4uPihmKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEF4PWludCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQT4Kc3RkOjpmdW5jdGlvbjxSKEF4LCBBLi4uKT4gd3JhcChzdGQ6OmZ1bmN0aW9uPFIoQS4uLik+IGZ1bmN0b3IpCnsKICAgIHJldHVybiBXcmFwPEF4LFIsQS4uLj4oZnVuY3Rvcik7Cn0KCmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCnsKICAgIGF1dG8gYmFyID0gd3JhcChmb28pOwogICAgc3RkOjpmdW5jdGlvbjxpbnQoaW50LCBpbnQpPiBiYXJmdW5jID0gd3JhcChmb28pOwoKICAgIHN0ZDo6Y291dCA8PCBiYXJmdW5jKC05OTksIDIxKSA8PCBzdGQ6OmVuZGw7CgogICAgLy8gd3JhcCB0aGUgYmFyZnVuYz8KICAgIGF1dG8gcmV3cmFwID0gd3JhcChiYXJmdW5jKTsKICAgIHN0ZDo6Y291dCA8PCByZXdyYXAoLTk5OSwgLTk5OSwgMjEpIDw8IHN0ZDo6ZW5kbDsKCiAgICByZXR1cm4gMDsKfQo=