Всем привет.
Имеется следующая проблема. Есть объекты 2х типов. Необходимо сравнить их (==), если сравнение возможно (то бишь наличиствует оператор сравнения) — выдать результат сравнения, если нет — соотв. образом обработать эту ситуацию. Фактически, необходимо нечто вроде is_equal_comparable, определяющего наличие встроенного или перегруженного оператора для сравнения указанных типов. С другой стороны, именно compile-time вывода о сравнимости типов не требуется. Попробовал поиграть с конвертируемостью, но там много проблем — очевидно, не все конвертируемые типы являются сравниваемыми, иногда при конверсии возможны потери значимости:
template <class U>
struct comparer
{
comparer(const U & other) : m_other(other)
{
}
template <class T>
void operator()(const T &t)
{
// convertible compare - convert second into first
m_result = compare(t, m_other, m_other);
}
template <class T>
void operator()(const T *t)
{
// convertible compare - convert second into first
m_result = compare(*t, m_other, m_other);
}
private:
struct any_conversion
{
template <typename T> any_conversion(const volatile T&){}
template <typename T> any_conversion(const T&){}
};
template <class T>
static bool compare(const T &first, const U &, const T &second)
{
return first == second;
}
template <class T1, class T2>
static bool compare(const T1 &, const T2 &, const any_conversion &)
{
return false;
}
public:
bool m_result;
private:
const U &m_other;
};
Что думает all, возможно ли не очень большими усилиями решить такую задачу?
Спасибо!