Операторы сравнения для generics
От: копатыч  
Дата: 13.03.08 16:03
Оценка:
Как правильно определить операторы сравнения для generic ?
Что не так и куда копать?

    class TestClass<T>
    {
        T m_Value;
        public static bool operator <(TestClass<T> x, TestClass<T> y)
        {
            //error! Operator '<' cannot be applied to operands of type 'T' and 'T'    
            //Вроде должен вызыватся свой < для T .... а вот если уже такого нет, то тогда alarm ... IMHO
            return x.m_Value < y.m_Value ;
        }
        public static bool operator >(TestClass<T> x, TestClass<T> y)
        {
            return !(x<y);
        }
        //........................
    }
//
Re: Операторы сравнения для generics
От: AngeL B. Россия  
Дата: 13.03.08 16:25
Оценка: 2 (1)
Здравствуйте, копатыч, Вы писали:

К>Как правильно определить операторы сравнения для generic ?

Поскольку обобщенный тип должен быть скомпилирован в месте определения (а не использования, как в C++) для параметров-типов в обобщенных классах нельзя использовать операторы сравнения, так же как и + — * / и т.д. так как компилятор не может определить применимы ли эти операторы к неизвестному типу.

Для этих целей используют ключевое словое where, налагающее ограничение (constraint) на параметр обобщенного типа и интерфейсы типа IComparable

К> public static bool operator >(TestClass<T> x, TestClass<T> y)

К> {
К> return !(x<y);
К> }
К> //........................

Кстати, в общем случае этот код не верен. Если А не меньше Б то это может значить как больше так и просто равно.
Re: Операторы сравнения для generics
От: Lloyd Россия  
Дата: 13.03.08 16:26
Оценка: 5 (2) +2
Здравствуйте, копатыч, Вы писали:

К>Как правильно определить операторы сравнения для generic ?


Наложи ограничение IComparable на параметр generic-а и используй метод интерфейса Compare
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: Операторы сравнения для generics
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.08 17:52
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Наложи ограничение IComparable на параметр generic-а


Скорее IEquatable. IComparable это для сортировки.
... << RSDN@Home 1.2.0 alpha 3 rev. 883 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[3]: Операторы сравнения для generics
От: Lloyd Россия  
Дата: 13.03.08 18:14
Оценка: +2
Здравствуйте, AndrewVK, Вы писали:

L>>Наложи ограничение IComparable на параметр generic-а


AVK>Скорее IEquatable. IComparable это для сортировки.


таки IComparable
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re: Операторы сравнения для generics
От: копатыч  
Дата: 13.03.08 19:05
Оценка:
Спасибо всем!
IComparable то что надо

получилось примерно так
   class TestClass<T> where T: IComparable<T>
    {
        T m_Value;
        public TestClass(T DefaultValue)
        {
            m_Value = DefaultValue;
        }
        public static bool operator <(TestClass<T> x, TestClass<T> y)
        {
            if(x.m_Value.CompareTo (y.m_Value)<0)return true;
            return false;
        }
        public static bool operator >(TestClass<T> x, TestClass<T> y)
        {
            if (x.m_Value.CompareTo(y.m_Value) > 0) return true;
            return false;
        }

         //...........
        }
    }
//
Re[2]: Операторы сравнения для generics
От: Lloyd Россия  
Дата: 13.03.08 19:57
Оценка: 1 (1) +3
Здравствуйте, копатыч, Вы писали:

К>получилось примерно так

К>
К>   class TestClass<T> where T: IComparable<T>
К>    {
К>        T m_Value;
К>        public TestClass(T DefaultValue)
К>        {
К>            m_Value = DefaultValue;
К>        }
К>        public static bool operator <(TestClass<T> x, TestClass<T> y)
К>        {
К>            return x.m_Value.CompareTo (y.m_Value)<0);
К>        }
К>        public static bool operator >(TestClass<T> x, TestClass<T> y)
К>        {
К>            return x.m_Value.CompareTo(y.m_Value) > 0;
К>        }

К>         //...........
К>        }
К>    }
К>
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: Операторы сравнения для generics
От: Аноним  
Дата: 15.03.08 09:39
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>Поскольку обобщенный тип должен быть скомпилирован в месте определения (а не использования, как в C++)


Что значит в месте определения ,а не использования, как в C++? Можете, пожалужста, подробнее?
Re[3]: Операторы сравнения для generics
От: AngeL B. Россия  
Дата: 15.03.08 14:05
Оценка:
Здравствуйте, Аноним, Вы писали:

AB>>Поскольку обобщенный тип должен быть скомпилирован в месте определения (а не использования, как в C++)

А>Что значит в месте определения ,а не использования, как в C++? Можете, пожалужста, подробнее?

Можем и подробнее. Для начала читать эту статью
Автор(ы): Владислав Чистяков (VladD2)
Дата: 24.06.2004
В статье рассказывается о новшествах, которые должны появиться в новой версии языка C#

. Там описаны отличия шаблонов C++ от обощенных типов .NET.

Теперь кратко. Цитата: "Обобщенные типы .NET компилируются в MSIL так же как и любой другой класс".
В этой фразе и зарыта вся разница. Когда Вы пишете шаблон С++, то компилятор проводит лишь поверхностный анализ правильности синтаксиса шаблона, а вот создание кода и, соответственно, полная синтаксическая проверка проводиться при первом использовании шаблона. Т.е. когда Вы впервые объявляете переменную (например, list<int> li; ) или параметр функции или ещё чего. В результате шаблоны допускают использование любых операций в шаблоне, но при этом не могут быть помещены в библиотеку (двоичную) и требуют своего исходного кода при компиляции. Т.е. Вы не можете использовать шаблон С++ в других языках.
В отличие, обобщенные типы .NET компилируются сразу в MSIL. Генерация конкретного машинного кода производиться JIT-компилятором при первом использовании. Это дает возможность не передавать исходный код обобщенного класса на сторону, позволяет использовать обобщение в языках, отличных от того на котором оно написано, но накладывает ограничение — правильность кода обобщения должна быть проверена на этапе компиляции обобщенного типа. Т.е. компилятор для генерации MSIL-кода должен быть уверен, что _все_ операции производимые внутри кода обобщения допустимы и должен знать какие функции он при этом будет вызывать.
Re[4]: Операторы сравнения для generics
От: Аноним  
Дата: 15.03.08 17:13
Оценка:
Спасибо!
Re[3]: Операторы сравнения для generics
От: _FRED_ Черногория
Дата: 15.03.08 20:42
Оценка:
Здравствуйте, Lloyd, Вы писали:

К>>        public static bool operator <(TestClass<T> x, TestClass<T> y)
К>>        {
К>>            return x.m_Value.CompareTo (y.m_Value)<0);
К>>        }
К>>        public static bool operator >(TestClass<T> x, TestClass<T> y)
К>>        {
К>>            return x.m_Value.CompareTo(y.m_Value) > 0;
К>>        }


Отсутствие проверок на null в перегруженных операторах может может вызывать недоумение искушённого пользователя
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.