SFINAE Para detectar a existência de função não membro

Alguém conhece um método para especializar um modelo, dependendo de um método não membro ser definido? Eu sei que existem várias maneiras de se especializar se existe uma função de membro, mas nunca vi um exemplo de não membro. O problema específico é especializar o operador << para shared_ptr para aplicar o operador << se o operador << estiver definido para T e imprimir a mera localização do ponteiro. Seria ótimo se todas as classes definissem o operador << como membro, mas infelizmente muitos usam funções livres. Estou imaginando algo como o seguinte:

template <typename T>
typename enable_if< ??? ,std::ostream &>::type operator<<( std::ostream & os, const shared_ptr<T> & ptr )
{
  if(ptr)
   return os << *ptr;
  else
   return os << "<NULL>";
}

template <typename T>
typename disable_if< ??? ,std::ostream &>::type operator<<( std::ostream & os, const shared_ptr<T> & ptr )
{
  if(ptr)
   return os << static_cast<intptr_t>( ptr.get() );
  else
   return os << "<NULL>";
}

Edit: Para a posteridade, aqui estava a solução de trabalho. Observe que o boost :: shared_ptr já possui um operador padrão << que gera o endereço, portanto, o disable_if é desnecessário. Como o operador << retorna uma referência, isso funciona. Para o caso geral, suspeito que isso precisaria ser adaptado para refletir o tipo de retorno da função em questão.

template <typename T>
typename boost::enable_if_c< boost::is_reference<decltype(*static_cast<std::ostream *>(0) << *static_cast<T *>(0) )>::value, std::ostream &>::type operator<<( std::ostream & os, const boost::shared_ptr<T> & ptr )
{
  if(ptr)
   return os << *ptr;
  else
   return os << "<NULL>";
}

questionAnswers(1)

yourAnswerToTheQuestion