Как правильно выравнивать структуры? - страница 3

 
Ihor Herasko #:

Обычно так и делают, когда зареннее неизвестен тип данных. Значение записывается в строку, а вместе с этой строкой следует еще один параметр, указывающий, какого типа данные записаны. Такой подход, правда, влияет на производительность (впрочем незначительно), но претендует на универсальность.

Обычно никто так не делает. Если вместе с данными хранить их тип, то преобразовывать в строку незачем.

 
Koldun Zloy #:

Обычно никто так не делает. Если вместе с данными хранить их тип, то преобразовывать в строку незачем.

Поясните, почему незачем?

 
Ihor Herasko #:

Поясните, почему незачем?

Потому что преобразование в строку занимает время и ничего не даёт.

 
Koldun Zloy #:

Потому что преобразование в строку занимает время и ничего не даёт.

"Занимает время" - я это уже указал. А вот почему "ничего не дает", непонятно. Напомню задачу - обрабатывать данные, тип которых заранее неизвестен. Это могут быть не только числовые данные, но и перечисления, и структуры, не говоря уже именно о строках.

 
Ihor Herasko #:

Напомню задачу - обрабатывать данные, тип которых заранее неизвестен.

Плохо понимаю, о чем речь. Не хватает лаконичного примера решения такой задачи в коде.

 
fxsaber #:

Плохо понимаю, о чем речь. Не хватает лаконичного примера решения такой задачи в коде.

В плюсах, начиная с 17-го стандарта, есть std::any, вот, наверное, о чем-то типа него и речь.
 
Ihor Herasko #:

"Занимает время" - я это уже указал. А вот почему "ничего не дает", непонятно. Напомню задачу - обрабатывать данные, тип которых заранее неизвестен. Это могут быть не только числовые данные, но и перечисления, и структуры, не говоря уже именно о строках.

Нет никаких проблем хранить их как есть, без преобразований. Слышали про тип VARIANT?

Не может быть данных, тип которых заранее неизвестен. Программа всегда работает с конкретным набором типов.

 
fxsaber #:

Плохо понимаю, о чем речь. Не хватает лаконичного примера решения такой задачи в коде.

Задача - сохранить данные, тип которых впоследствии выберет пользователь. Для примера ограничимся четырьмя типами данных, хотя на самом деле их намного больше. Если делать без преобразования в строку, то нужно изначально создать все варианты типов данных, записав в соответствующий тип введенные данные:

struct Data
{
   bool         bData;
   int          nData;
   long         lData;
   string       sData;
}

Хотя уже тут можно возразить, что bool, int и long можно свести к одному типу или использовать объединение. Но, напоминаю, это пример.

А можно не городить огород (типов данных намного больше 4-х) и записать любой тип данных сразу в строку, просто добавив указание типа данных:

enum ENUM_DATA_TYPE
{
        DATA_TYPE_BOOL,
        DATA_TYPE_INT,
        DATA_TYPE_LONG,
        DATA_TYPE_STRING
};

struct Data
{
   ENUM_DATA_TYPE           eType;
   string                   sData;
};

Да, теряем в производительности на преобразованиях из строки и в строку. Но это небольшая плата за универсальность.

 
Koldun Zloy #:

Нет никаких проблем хранить их как есть, без преобразований. Слышали про тип VARIANT?

Не может быть данных, тип которых заранее неизвестен. Программа всегда работает с конкретным набором типов.

В MQL? Не слышал. В документации не могу найти. Если не затруднит, скиньте ссылку на описание.

Ну а если речь про std::variant, то суть его примерно такая же, как я описал.

 
Ihor Herasko #:

В MQL? Не слышал. В документации не могу найти. Если не затруднит, скиньте ссылку на описание.

Ну а если речь про std::variant, то суть его примерно такая же, как я описал.

Я имел в виду VARIANT из WINAPI. Можете увидеть его в моей библиотеке.

В std::variant тоже нет преобразования в строку.

Библиотека для работы с COM-объектами.
Библиотека для работы с COM-объектами.
  • www.mql5.com
Эта библиотека даёт возможность работать с COM-объектами, предоставленными некоторыми приложениями. Например: Excel, Word, Mathcad, Matlab. А также объект ADODB для работы с базами данных через драйвер ODBC. Библиотека работает и в MT4 и в MT5.
Причина обращения: