template< typename T > auto doSomething( T &t ) -> decltype( t.doSomething() ) { return t.doSomething(); } template< typename T > int doSomething( T &t ) { return 0; } struct A { long doSomething() { return 1; } }; int main() { A a; doSomething( a ); return 0; }