Перебрал несколько способов на stackoverflow определить наличие оператора "==" у класса при помощи SFINAE. Но они не рабочие. 
Первый способ:
C++ (Qt)
#include <memory>
#include <iostream>
using namespace std;
 
template <typename Type>
struct HasEqualOperator
{
    typedef char yes[1];
    typedef char no[2];
 
    template <int N>
    struct SFINAE {};
 
    template <typename T>
    static yes& isEqualComparable(SFINAE<sizeof(*static_cast<T*>(0) == *static_cast<T*>(0))>* = 0);
 
    template <typename T>
    static no& isEqualComparable(...);
 
    enum { value = sizeof(isEqualComparable<Type>(0)) == sizeof(yes) };
};
 
struct NoOperator
{};
 
int main() {
 
	typedef std::shared_ptr<int> MyType;
 
	cout << HasEqualOperator<MyType>::value << endl;
	cout << HasEqualOperator<NoOperator>::value << endl;
 
	return 0;
}
Студийный компилятор не определяет отсутствие оператора == у struct NoOperator.
Второй вариант с перегрузкой оператора ==:
C++ (Qt)
#include <memory>
#include <iostream>
using namespace std;
 
namespace OpCheck
{
typedef bool no[2];
template<typename T> static no& operator==(const T&, const T&);
template <typename T>
struct EqualOperatorExists
{
    enum { value = (sizeof(*(T*)(0) == *(T*)(0)) != sizeof(no)) };
};
}
 
int main() {
 
	typedef std::shared_ptr<int> MyType;
 
	cout << OpCheck::EqualOperatorExists<MyType>::value << endl;
 
	return 0;
}
Но он не собирается для shared_ptr на всех компиляторах.
Можно ли как-то починить первый способ или есть лучшее решение?
Буст не предлагать, хотелось бы обойтись только стандартом C++11
Тестить код можно здесь: 
http://rextester.com/RBJVR88775