Распространенная ситуация при программинге, как быть? Быстродействие vs Лаконичность - страница 3
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну не дает MQL писать лаконично и красиво иногда:
Разработчики, зачем такое ограничение?Борьба за оптимизацию не идет. Просто ощущаешь полный дискомфорт, когда написано с явно повторяющимися при выполнении лишними кусками кода. Как истинный извращенец, представляю себя на месте не компилятора, а интерпретатора. И четко чувствую глупость проверки ненужных условий.
Ну ты решил разобрать напрямую код, который был показан только для демонстрации проблемы. GetNums может выглядеть гораздо силнее, и StructN могут быть ничем не похожими. В общем случае FlagSource -целая, в GetNums вместо if стоит либо switch, либо сложные условные выражения. Короче, пример показывает концепцию, а не конкретную ситуацию.
Значит, код, всё-таки, достаточно разный...
И есть дискомфорт от проверки ненужных условий, а также от повторяющихся кусков кода, но нет дискомфорта от макросов, которые как раз и создаются для повторения...
Есть такой автоматизм, как перегрузка. Дублирование кода при этом напоминает оное от макросов, но только, в отличие от макросов, компилятор проверит соответствие типов и "подберёт" нужную версию функции автоматически, а от проверки "ненужных" условий избавиться удаётся также в самом начале:
Не знаю, насколько такое решение годится для реального кода.Значит, код, всё-таки, достаточно разный...
И есть дискомфорт от проверки ненужных условий, а также от повторяющихся кусков кода, но нет дискомфорта от макросов, которые как раз и создаются для повторения...
Есть такой автоматизм, как перегрузка. Дублирование кода при этом напоминает оное от макросов, но только, в отличие от макросов, компилятор проверит соответствие типов и "подберёт" нужную версию функции автоматически, а от проверки "ненужных" условий избавиться удаётся также в самом начале:
Не знаю, насколько такое решение годится для реального кода.Нет, ну макросы позволяют копи-пастить не самому, а компилятору. Поэтому код, как миниму, лаконичнее выглядит. Хотя красивым его не назвать, конечно.
Постом выше хотел перегрузку записать через шаблоны (чтобы не копи-пастить) - обломался.
ЗЫ Прокомменируй.
Написал общий интерфейс, но что-то снова не клеется. Желаемое видно из этого кода:
Подскажите, как прописать общий интерфейс так, чтобы оператор [] возвращал различный тип данных, в зависимости от производного класса?Ну не дает MQL писать лаконично и красиво иногда:
Разработчики, зачем такое ограничение?Кстати, данная декларация:
означает в C++ отнюдь не ссылку на массив, а массив ссылок, чего не может быть, и поэтому в C++ не компилируется.
А в MQL4++ - компилируется и означает ссылку на массив. Команда разработчиков явно не тянет ни дизайн языка подобной навороченности, ни его работающую реализацию.
Вот, взять, хотя бы ту же самую перегрузку. Она - есть, но её не используют. Например, есть такая функция MarketInfo(), объявленная так:
Но для некоторых констант ENUM_MARKETINFO возвращаемое значение - совсем не типа double, а типа int или даже datetime. Поэтому при компиляции данного кода появляются предупреждения:
Почему не была применена перегрузка? Например, прототипы в гипотетическом заголовочном файле могли бы выглядеть вот так:
и задача была бы решена: константы разбиты на группы в соответствии с возвращаемым для них функцией MarketInfo() типами, и для каждой группы определено своё перечисление, каждое из которых является отдельным типом и входит в сигнатуру функции MarketInfo(), поскольку является её параметром.
Вот код, эмулирующий наличие подобной реализации и демонстрирующий, что перегрузка в данном месте прекрасно справляется с поставленной задачей:
Ни единого предупреждения, при том, что в коде OnStart() - ни единого приведения типа, потому что не требуется. Всё, что выше функции OnStart(), должно быть "где-то там", как сейчас "где-то там" находятся определения MarketInfo() и перечисления ENUM_MARKETINFO. Данный код выводит в лог следующее:
Однако, уже 745-й build, а данная техника до сих пор не применяется, и люди продолжают спрашивать, что им делать с предупреждениями для возвращаемых значений, отличных от типа double.
Это говорит об уровне команды. Наверное, не стоит с них требовать слишком многого. Тем более, что уже никуда не деться.
Написал общий интерфейс, но что-то снова не клеется. Желаемое видно из этого кода:
Подскажите, как прописать общий интерфейс так, чтобы оператор [] возвращал различный тип данных, в зависимости от производного класса?Например, убрать виртуальность у operator [] в базовом классе. Шаблоны методов не могут быть виртуальными даже в C++.
Спасибо, убрал. Меня удивило, что даже при разных сигнатурах оператора [], получается реализовать сокрытие, если operator [] в производном классе сделать virtual:
Совсем неочевидное сокрытие - нигде о таком не слышал. Теперь работает, как надо.
ЗЫ Это баг?:
Спасибо, убрал. Меня удивило, что даже при разных сигнатурах оператора [], получается реализовать сокрытие, если operator [] в производном классе сделать virtual:
Совсем неочевидное сокрытие - нигде о таком не слышал. Теперь работает, как надо.
ЗЫ Это баг?:
Странный пример. Зачем A1::operator[]() и A2::operator[]() сделаны виртуальными, если эта виртуальность ни где не используется?
Странный пример. Зачем A1::operator[]() и A2::operator[]() сделаны виртуальными, если эта виртуальность ни где не используется?
Так написано же в исходнике:
Никак по-другому. Изврашенцем быть ты не должен, но изврат понимать обязан!
Походу код пишу и сталкиваюсь с такими затыками. Эту странность, в частности, использую уже вовсю на практике.
Возможно, не ведаю, что творю...
Так написано же в исходнике:
Никак по-другому. Изврашенцем быть ты не должен, но изврат понимать обязан!
Походу код пишу и сталкиваюсь с такими затыками. Эту странность, в частности, использую уже вовсю на практике.
Возможно, не ведаю, что творю...