Перебрал несколько способов на 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