#include <iostream>
#include <type_traits>
template < typename T >
void foo( const T& arg ) {
using namespace std;
cout << "foo: ";
if( is_same<int,T>::value ) {
cout << "<int> " << arg << endl;
} else if( is_same<long,T>::value ) {
cout << "<long> " << arg << endl;
} else if( is_same<std::string,T>::value ) {
cout << "<string> " << arg << endl;
} else {
cout << "<other> " << arg << endl;
}
}
int main() {
foo( 1 );
foo( 2L );
foo( 3u );
foo( std::string("hello world") );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgp2b2lkIGZvbyggY29uc3QgVCYgYXJnICkgewogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIAogICAgY291dCA8PCAiZm9vOiAiOwogICAgaWYoIGlzX3NhbWU8aW50LFQ+Ojp2YWx1ZSApIHsKICAgICAgICBjb3V0IDw8ICI8aW50PiAiIDw8IGFyZyA8PCBlbmRsOwogICAgfSBlbHNlIGlmKCBpc19zYW1lPGxvbmcsVD46OnZhbHVlICkgewogICAgICAgIGNvdXQgPDwgIjxsb25nPiAiIDw8IGFyZyA8PCBlbmRsOwogICAgfSBlbHNlIGlmKCBpc19zYW1lPHN0ZDo6c3RyaW5nLFQ+Ojp2YWx1ZSApIHsKICAgICAgICBjb3V0IDw8ICI8c3RyaW5nPiAiIDw8IGFyZyA8PCBlbmRsOwogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8ICI8b3RoZXI+ICIgPDwgYXJnIDw8IGVuZGw7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgCiAgICBmb28oIDEgKTsKICAgIGZvbyggMkwgKTsKICAgIGZvbyggM3UgKTsKICAgIGZvbyggc3RkOjpzdHJpbmcoImhlbGxvIHdvcmxkIikgKTsKfQ==