#include <iostream>
using namespace std;
template <typename Fnc, typename Args>
void t (Fnc f, Args arg) {
f (arg);
}
void foo (int x) {
cout<<x;
}
void bar (int& x) {
cout << ++x;
}
template <typename T>
struct refholder {
T *ptr;
refholder(T& x):ptr(&x){}
operator T& () { return *ptr; }
};
template <typename T>
refholder<T> makeref (T& x) {
return refholder<T>(x);
}
int main () {
int x=2;
t (foo, x);
t (bar, makeref(x));
cout << x;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIEZuYywgdHlwZW5hbWUgQXJncz4Kdm9pZCB0IChGbmMgZiwgQXJncyBhcmcpIHsKICBmIChhcmcpOwp9Cgp2b2lkIGZvbyAoaW50IHgpIHsKICBjb3V0PDx4Owp9CnZvaWQgYmFyIChpbnQmIHgpIHsKICBjb3V0IDw8ICsreDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCByZWZob2xkZXIgewogIFQgKnB0cjsKICByZWZob2xkZXIoVCYgeCk6cHRyKCZ4KXt9CiAgb3BlcmF0b3IgVCYgKCkgeyByZXR1cm4gKnB0cjsgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnJlZmhvbGRlcjxUPiBtYWtlcmVmIChUJiB4KSB7CiAgcmV0dXJuIHJlZmhvbGRlcjxUPih4KTsKfQoKaW50IG1haW4gKCkgewogIGludCB4PTI7CiAgdCAoZm9vLCB4KTsKICB0IChiYXIsIG1ha2VyZWYoeCkpOwogIGNvdXQgPDwgeDsKfQo=