Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения - страница 21

 
fxsaber:

Ведь напрашивается просто перегрузка GetHashCode для нужного типа, а не начинать городить IEqualityComparable.

В таком случае концы уходят очень далеко, и возможная ошибка возникнет где-то в недрах библиотеки.  И там думай-гадай, почему не найдена какая-то функция и чья это вина.   А интерфейсы заранее гарантируют, что все необходимые функции уже определены в объекте.

 
Alexey Navoykov:

В таком случае концы уходят очень далеко, и возможная ошибка возникает где-то в недрах библиотеки.  И там думай-гадай, почему не найдена какая-то функция и чья это вина.   А интерфейсы заранее гарантируют, что все необходимые функции уже определены в объекте.

Можете показать пример для MqlTick?

 
Alexey Navoykov:

 А интерфейсы заранее гарантируют, что все необходимые функции уже определены в объекте.

ага, вот только эти классы претендуют на звание универсальных и должны работать для всех типов с из коробки.

 
fxsaber:

Можете показать пример для MqlTick?

class CMqlTick : public IEqualityComparable<CMqlTick*>
{
 public: 
   MqlTick _tick;
   bool    Equals(CMqlTick* obj) { return obj!=NULL && obj._tick.time==_tick.time; }
   int     HashCode(void)        { return _tick.time; }
};
Тут конечно издержки, что придётся помещать в класс, плюс проверка указателя.
 
Alexey Navoykov:
Тут конечно издержки, что придётся помещать в класс, плюс проверка указателя.

Спасибо, но не получается понять, в чем преимущество такого подхода на деле?

В СБ такой код

//+------------------------------------------------------------------+
//| Class CKeyValuePair<TKey, TValue>.                               |
//| Usage: Defines a key/value pair that can be set or retrieved.    |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
class CKeyValuePair: public IComparable<CKeyValuePair<TKey,TValue>*>
  {
protected:
   TKey              m_key;
   TValue            m_value;

public:
                     CKeyValuePair(void)                                              {   }
                     CKeyValuePair(TKey key,TValue value): m_key(key), m_value(value) {   }
                    ~CKeyValuePair(void)                                              {   }
   //--- methods to access protected data
   TKey              Key(void)           { return(m_key);   }
   void              Key(TKey key)       { m_key=key;       }
   TValue            Value(void)         { return(m_value); }
   void              Value(TValue value) { m_value=value;   }
   //--- method to create clone of current instance
   CKeyValuePair<TKey,TValue>*Clone(void) { return new CKeyValuePair<TKey,TValue>(m_key,m_value); }
   //--- method to compare keys
   int               Compare(CKeyValuePair<TKey,TValue>*pair) { return ::Compare(m_key,pair.m_key); }
   //--- method for determining equality
   bool              Equals(CKeyValuePair<TKey,TValue>*pair) { return ::Equals(m_key,pair.m_key); }
   //--- method to calculate hash code   
   int               HashCode(void) { return ::GetHashCode(m_key); }

Получается, что предложенные пляски только для того, чтобы не перегружать эту GetHashCode. Но стоит ли овчинка выделки в данном случае?

 
fxsaber:

Спасибо, но не получается понять, в чем преимущество такого подхода на деле?

В СБ такой код

Получается, что предложенные пляски только для того, чтобы не перегружать эту GetHashCode. Но стоит ли овчинка выделки в данном случае?

Если критична скорость, то наверно лучше перегрузить.

Суть в том, что в .NET, откуда портировалась данная библиотека,  все встроенные типы уже имеют интерфейсы изначально.  Вот как определён int, он же Int32:

public struct Int32 : IComparable, IFormattable, IConvertible, 
        IComparable<int>, IEquatable<int>

Поэтому там перегрузки и нет никакой.

И сам класс CKeyValuePair был бы объявлен чуть по другому.

Ну а тут пытаются всё это реализовать, насколько позволяют ограниченные возможности MQL.   Хотя лучше бы потратили это время на улучшение функционала языка.  Тогда бы потом достаточно было скопипастить всю .Net библиотеку, и всё бы работало.

 
Alexey Navoykov:
Тут конечно издержки, что придётся помещать в класс, плюс проверка указателя.
а в чем проблема этот код запихать в перегрузку GetHashCode? тогда наследоваться от интерфейса не надо
 
Комбинатор:
а в чем проблема этот код запихать в перегрузку GetHashCode? тогда наследоваться от интерфейса не надо

Можно конечно. Но это осложняет контроль за процессом. Допустим у тебя куча разных GetHashCode, разбросанных по коду, и какой из них тут вызывается (и где он находится), может быть сложно понять.  Например при вызове функции аргумент кастится к какому-то другому типу.  В C# видимо поэтому возможности шаблонов урезаны по сравнению с C++

 
Alexey Navoykov:

Можно конечно. Но это осложняет контроль за процессом.

нормально. в С++ этот интерфейс нафиг не нужен, нормальное взаимодействие достигается простой перегрузкой оператора <, Причем этот оператор может быть определен ВНЕ КЛАССА.

по-моему это гораздо проще и лаконичнее чем воротить такие конструкции. но нужна нативная поддержка перегрузки оператора < вне класса.

а для встроенных структур ничего кроме перегрузки GetHashCode не остается, т.к. заглушка ужасна, а отнаследовать нет возможности. наследование от структуры костыльное решение, потому что принуждает при пользовании стандартных функций вручную приводить структуру к пользовательскому наследнику, чтобы все пахало как задумано.
 
Комбинатор:

наследование от структуры костыльное решение, потому что принуждает при пользовании стандартных функций вручную приводить структуру к пользовательскому наследнику, чтобы все пахало как задумано.

Видимо вы имеете ввиду не наследование, а обёртку из класса над структурой?

На самом деле такое "принуждение" - тоже недостаток функционала MQL, т.к. отсутствует возможность перегрузки оператора приведения.   Иначе бы класс легко приводился к структуре неявно.

В общем язык надо дорабатывать и дорабатывать.  Но чё-то никто не чешется...  Уже 2 года застой в развитии, никаких улучшений и нововведений.

При том что сами же разработчики здесь сетуют на отсутствие множественных интерфейсов и прочих фишек, но продолжают есть кактус )

Причина обращения: