is_equal_comparable for any type - is it possible?
От: Andrew S Россия http://alchemy-lab.com
Дата: 01.12.09 08:54
Оценка:
Всем привет.

Имеется следующая проблема. Есть объекты 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, возможно ли не очень большими усилиями решить такую задачу?

Спасибо!
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.