#include <iostream>

struct My
{
   typedef int foo;
};

struct My2
{
};

template<typename T, typename I=int> struct call_traits {
	static void Bar(...)
	{
		std::cout << "...\n";
	}
};

template<typename T> struct call_traits<T, typename T::foo> {
	static void Bar(const T&, int z=typename T::foo())
	{
		std::cout << "My\n";
	}
};

template<typename T> void Bar(const T& t)
{
	call_traits<T>::Bar(t);
}

int main() 
{
    My my;
    Bar(my); // OK
    My2 my2;
    Bar(my2); // Still OK
    return 0;
}