Требуется реализовать примерно такую конструкцию, чтобы функция могла отдельно обрабатывать переменные стандартных типов, и отдельно объекты структур. Т.е. нужна специализация шаблонной функции, либо просто сочетание шаблона и перегрузки. Но MQL ничего этого не поддерживает, в отличие от C++.
Может у кого есть идеи, как тут выкрутиться костыльными способами? Т.е. каким-то образом отделить структуры от остальных типов.
Может у кого есть идеи, как тут выкрутиться костыльными способами? Т.е. каким-то образом отделить структуры от остальных типов.
- Для структурной Write добавить второй фальш-параметр.
- Поскольку названия стандартных типов знаем, сделать только один шаблонный вариант, а внутри switch (typename(T)).
- Поиграться с const.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2016.10.23 23:52
Наткнулся у себя на хороший примерclass AНе очевидно было в начале, почему предупреждение. Умный компилятор, однако.
{
public:
void operator =( const string Value ) const { return; }
void operator =( const int Value ) { return; }
};
void OnStart()
{
const A a;
a = 0; // implicit conversion from 'number' to 'string'
}
Может у кого есть идеи, как тут выкрутиться костыльными способами? Т.е. каким-то образом отделить структуры от остальных типов.
Передавать структуры и классы по указателю. Указатели специализируются легко.
sfinae насколько я знаю в MQL нет, так что красиво не получится.
Передавать структуры и классы по указателю. Указатели специализируются легко.
Что-то мой древний топик растревожили, да всё без толку :)
- Для структурной Write добавить второй фальш-параметр.
- Поскольку названия стандартных типов знаем, сделать только один шаблонный вариант, а внутри switch (typename(T)).
- Поиграться с const.
1. Тогда уж проще название функции переименовать :) Так что не вариант.
2. Ну switch - это, во-первых, рантайм (а значит лишние тормоза), и во вторых, так можно разделить только простые типы, поскольку они свободно приводятся друг к другу. А для структур это не поможет.
3. Ну если передавать именно константную структуру, то может и выйдет, но здесь не шла речь о константности.
Комбинатор:
Передавать структуры и классы по указателю. Указатели специализируются легко.
Возможно вы посланы из будущего, где в MQL уже есть указатели на структуры, но нашей реальности пока такого нет.
А теперь, господа знатоки, внимание, правильный ответ:
struct A
{
template<typename T>
static void Func(T& a) { } // обработчик для структур
};
struct B : A
{
static void Func(short& a) { }
static void Func(int& a) { }
static void Func(long& a) { }
static void Func(double& a) { }
};
template<typename T>
void Func(T& a) { B::Func(a); }
Надеюсь в будущем допилят шаблоны функций, чтобы можно было обходится без таких костылей. А если добавят указатели на любые типы данных, то будет вообще замечательно.
А пока только такой вариант нашёл.
Возможно вы посланы из будущего, где в MQL уже есть указатели на структуры, но нашей реальности пока такого нет.
2. Ну switch - это, во-первых, рантайм (а значит лишние тормоза), и во вторых, так можно разделить только простые типы, поскольку они свободно приводятся друг к другу. А для структур это не поможет.
Не вижу препятствий.
А теперь, господа знатоки, внимание, правильный ответ:
struct A
{
static template<typename T>
void Func(T& a) { } // обработчик для структур
};
struct B : A
{
static void Func(short& a) { }
static void Func(int& a) { }
static void Func(long& a) { }
static void Func(double& a) { }
};
template<typename T>
void Func(T& a) { B::Func(a); }
Надеюсь в будущем допилят шаблоны функций, чтобы можно было обходится без таких костылей. А если добавят указатели на любые типы данных, то будет вообще замечательно.
А пока только такой вариант нашёл.
Этот вариант предложили в первом ответе. Только не понимаю, почему компилятор не ругается. Фактически, одно и то же.
Шаблоны улучшать в данном случае - видится лишним. Нужно просто приоритеты компилятору учитывать. Если явно задан тип в описании функции - вызывать ее. Нет - шаблонный вариант.
Alexey Navoykov:
А пока только такой вариант нашёл.
Не вижу препятствий.
Этот вариант предложили в первом ответе. Только не понимаю, почему компилятор не ругается. Фактически, одно и то же.
Нет, в первом ответе предложили совсем другое. Там речь шла о шаблонах классах, которых на тот момент даже ещё не было в MQL. Видимо тот человек был такой же, как Комбинатор, прилетевший из будущего :) А даже если б и сейчас делать с шаблонами класса, то всё-равно ничего не выйдет, ибо их специализация не поддерживается
Только не понимаю, почему компилятор не ругается.
Я в прошлом сообщении в структуре A поставил static не в том месте. Исправил.
Шаблоны улучшать в данном случае - видится лишним. Нужно просто приоритеты компилятору учитывать. Если явно задан тип в описании функции - вызывать ее. Нет - шаблонный вариант.
Это по сути и есть та же специализация.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Требуется реализовать примерно такую конструкцию, чтобы функция могла отдельно обрабатывать переменные стандартных типов, и отдельно объекты структур. Т.е. нужна специализация шаблонной функции, либо просто сочетание шаблона и перегрузки. Но MQL ничего этого не поддерживает, в отличие от C++.
Может у кого есть идеи, как тут выкрутиться костыльными способами? Т.е. каким-то образом отделить структуры от остальных типов.