#include <utility>
namespace implementation {
template<typename F>
struct Alias {
F f;
template<typename... Args>
auto operator()(Args && ...args) {
return f(std::forward<Args>(args)...);
}
};
}
template<typename F>
auto MakeAlias(F f) {
return implementation::Alias<F>{f};
}
void foo(int) {}
int bar() {return 42;}
auto boo = MakeAlias(foo);
auto baz = MakeAlias(bar);
int main() {
boo(21);
baz();
}
I2luY2x1ZGUgPHV0aWxpdHk+CgpuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogIHRlbXBsYXRlPHR5cGVuYW1lIEY+CiAgc3RydWN0IEFsaWFzIHsKICAgIEYgZjsKICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CiAgICBhdXRvIG9wZXJhdG9yKCkoQXJncyAmJiAuLi5hcmdzKSB7CiAgICAgIHJldHVybiBmKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CiAgICB9CiAgfTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgRj4KYXV0byBNYWtlQWxpYXMoRiBmKSB7CiAgcmV0dXJuIGltcGxlbWVudGF0aW9uOjpBbGlhczxGPntmfTsKfQoKdm9pZCBmb28oaW50KSB7fQppbnQgYmFyKCkge3JldHVybiA0Mjt9CgphdXRvIGJvbyA9IE1ha2VBbGlhcyhmb28pOwphdXRvIGJheiA9IE1ha2VBbGlhcyhiYXIpOwoKaW50IG1haW4oKSB7CiAgYm9vKDIxKTsKICBiYXooKTsKfQ==