#include // types used to prioritize function overloads struct Preferred { }; struct NotPreferred { NotPreferred( Preferred ) { } }; template< typename T > auto doSomething( T &t, Preferred ) -> decltype( t.doSomething() ) { return t.doSomething(); } template< typename T > void doSomething( T &t, NotPreferred ) { std::cout << "general"; } struct A { void doSomething() { std::cout << "A, "; } }; int main() { A a; int b; doSomething( a, Preferred() ); doSomething( b, Preferred() ); return 0; // outputs: A, general }