Шаблонные коллекции данных с произвольным типом

 

Господа, подскажите, пожалуйста, можно ли создать объект CQueue, который работал бы моим типом данных, например с таким:

struct SData
   {
   ulong Ticket;
   double Price;
   }

или CQueue будет работать только со стандартными типами (int, double и пр.)?

Документация по MQL5: Стандартная библиотека / Шаблонные коллекции данных / CQueue
Документация по MQL5: Стандартная библиотека / Шаблонные коллекции данных / CQueue
  • www.mql5.com
Класс CQueue — динамическая коллекция данных типа T, организованная в виде очереди, который работает по принципу "первым вошёл — первым вышел" (FIFO).
 

На данный момент сделать это просто не получится.

Обратитесь сюда.

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 
fxsaber:

На данный момент сделать это просто не получится.

Обратитесь сюда.

Поручик! 

 

Спасибо за ответ!

Именно туда я и обратился, и там написано "...могут хранить пользовательские типы данных". Что же имелось в виду?

CQueue не принимает мой тип данных struct SData.

Пришлось сделать массив типа int и хранить в нем индексы массива struct SData.

Интересно, было ли другое решение?

 

Я без понятия как устроены коллекции из СБ, но в свой контейнер могу положить ссылки на объекты. Так что вопрос: что будет если сделать struct классом с публичными членами и подсунуть в коллекцию из СБ?

class SData
{
  public:
    ulong Ticket;
    double Price;
};

void test()
{
  RubbArray<SData *> xxx;
  SData data = {1, 0.5};
  xxx << &data;
}
 
Stanislav Korotky:

Я без понятия как устроены коллекции из СБ, но в свой контейнер могу положить ссылки на объекты. Так что вопрос: что будет если сделать struct классом с публичными членами и подсунуть в коллекцию из СБ?

Очевидно, он будет работать с СБ;)

8vlma:

CQueue не принимает мой тип данных struct SData.

Со структурами ни Generic, не CObject не работает. 

8vlma:

Интересно, было ли другое решение?

Было. Нужно было изменить struct на class

 
Вот как. Спасибо, что подсказали.
 

на самом деле реализация вызывает эээ как минимум вопросы, даже не касаясь нутра.

зачем нужны шаблонные контейнеры которые не поддерживают целую прослойку типов языка?

это уже вторая попытка реализации контейнеров от МК, и вторая комом.

 
TheXpert:

на самом деле реализация вызывает эээ как минимум вопросы, даже не касаясь нутра.

зачем нужны шаблонные контейнеры которые не поддерживают целую прослойку типов языка?

это уже вторая попытка реализации контейнеров от МК, и вторая комом.

Здесь вопрос еще и в том, а потянет ли сам язык такую универсальность.

 
Vasiliy Sokolov:

Здесь вопрос еще и в том, а потянет ли сам язык такую универсальность.

Вот такой пример со своими подпорками у меня получилось скомпилить

#include <generic/queue.mqh>

struct SData
   {
   ulong Ticket;
   double Price;
   
   bool operator == (const SData& other) const
   {
      return other.Ticket == Ticket && other.Price == Price;
   }
   };

void test()
{
  CQueue<SData> xxx;
  SData data = {1, 0.5};
  xxx.Add(data);
}

void OnStart()
{
}
так что думаю можно допилить напильником, даже с учетом нативных структур, у которых нельзя определить оператор ==
 
TheXpert:

Вот такой пример со своими подпорками у меня получилось скомпилить

так что думаю можно допилить напильником, даже с учетом нативных структур, у которых нельзя определить оператор ==

Генерик измененный по всей видимости? У меня на стандартном не компилится.

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