#include <iostream>
#include <utility>
struct S { int i; bool b; char c; };
// Type-dependent processors.
void func(const int&) { std::cout << "func(const int&)\n"; }
void func(const bool&) { std::cout << "func(const bool&)\n"; }
void func(const char&) { std::cout << "func(const char&)\n"; }
void func(const double&) { std::cout << "func(const double&)\n"; }
void func(const S&) { std::cout << "func(const S&)\n"; }
// Main function, defers to processor.
template<typename T> void(*var)(const T&) = func;
template<typename T> void call(T&& t) { return var<T>(std::forward<T>(t)); }
// Put it to use.
int main() {
call(3);
call(S{});
call(true);
call(3.);
call('3');
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnN0cnVjdCBTIHsgaW50IGk7IGJvb2wgYjsgY2hhciBjOyB9OwoKLy8gVHlwZS1kZXBlbmRlbnQgcHJvY2Vzc29ycy4Kdm9pZCBmdW5jKGNvbnN0ICAgIGludCYpIHsgc3RkOjpjb3V0IDw8ICJmdW5jKGNvbnN0ICAgIGludCYpXG4iOyB9CnZvaWQgZnVuYyhjb25zdCAgIGJvb2wmKSB7IHN0ZDo6Y291dCA8PCAiZnVuYyhjb25zdCAgIGJvb2wmKVxuIjsgfQp2b2lkIGZ1bmMoY29uc3QgICBjaGFyJikgeyBzdGQ6OmNvdXQgPDwgImZ1bmMoY29uc3QgICBjaGFyJilcbiI7IH0Kdm9pZCBmdW5jKGNvbnN0IGRvdWJsZSYpIHsgc3RkOjpjb3V0IDw8ICJmdW5jKGNvbnN0IGRvdWJsZSYpXG4iOyB9CnZvaWQgZnVuYyhjb25zdCAgICAgIFMmKSB7IHN0ZDo6Y291dCA8PCAiZnVuYyhjb25zdCAgICAgIFMmKVxuIjsgfQoKLy8gTWFpbiBmdW5jdGlvbiwgZGVmZXJzIHRvIHByb2Nlc3Nvci4KdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCgqdmFyKShjb25zdCBUJikgPSBmdW5jOwp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGNhbGwoVCYmIHQpIHsgcmV0dXJuIHZhcjxUPihzdGQ6OmZvcndhcmQ8VD4odCkpOyB9CgovLyBQdXQgaXQgdG8gdXNlLgppbnQgbWFpbigpIHsKICAgIGNhbGwoMyk7CiAgICBjYWxsKFN7fSk7CiAgICBjYWxsKHRydWUpOwogICAgY2FsbCgzLik7CiAgICBjYWxsKCczJyk7Cn0=