#include <iostream>
#include <type_traits>
template < typename T >
void foo( const T& arg ) {
using namespace std;
static_assert( is_same< int ,T> :: value |
is_same< long ,T> :: value |
is_same< std:: string ,T> :: value , "only accept int, long and std::string as argument types" ) ;
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;
}
}
int main( ) {
foo( 3u ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgp2b2lkIGZvbyggY29uc3QgVCYgYXJnICkgewoKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CgogICAgc3RhdGljX2Fzc2VydCggaXNfc2FtZTxpbnQsVD46OnZhbHVlIHwgCiAgICAgICAgICAgICAgICAgICBpc19zYW1lPGxvbmcsVD46OnZhbHVlIHwKICAgICAgICAgICAgICAgICAgIGlzX3NhbWU8c3RkOjpzdHJpbmcsVD46OnZhbHVlICwgIm9ubHkgYWNjZXB0IGludCwgbG9uZyBhbmQgc3RkOjpzdHJpbmcgYXMgYXJndW1lbnQgdHlwZXMiICk7CgogICAgY291dCA8PCAiZm9vOiAiOwogICAgaWYoIGlzX3NhbWU8aW50LFQ+Ojp2YWx1ZSApIHsKICAgICAgICBjb3V0IDw8ICI8aW50PiAiIDw8IGFyZyA8PCBlbmRsOwogICAgfSBlbHNlIGlmKCBpc19zYW1lPGxvbmcsVD46OnZhbHVlICkgewogICAgICAgIGNvdXQgPDwgIjxsb25nPiAiIDw8IGFyZyA8PCBlbmRsOwogICAgfSBlbHNlIGlmKCBpc19zYW1lPHN0ZDo6c3RyaW5nLFQ+Ojp2YWx1ZSApIHsKICAgICAgICBjb3V0IDw8ICI8c3RyaW5nPiAiIDw8IGFyZyA8PCBlbmRsOwogICAgfQp9CgppbnQgbWFpbigpIHsKCiAgICBmb28oIDN1ICk7Cn0=