Требуется решение (специализация шаблонной функции) - страница 2

 
Комбинатор:
А стринги, массивы, всякие float, ushort, char и т.п. ?
Ну также можно добавить туда нужное по вкусу.
 
fxsaber:
Значит, вариант со switch рабочий, хоть и тормозной.
Почему вы решили, что он рабочий?  Приведите пример.
 
Alexey Navoykov:
Почему вы решили, что он рабочий?  Приведите пример.
template<typename T>
void WriteStruct( T& Value ) { Print(__FUNCSIG__); }

template<typename T>
void WriteStandart( T& Value ) { Print(__FUNCSIG__); }

template<typename T>
void Write( T& Value )
{
  const string Type = typename(T);

  if ((Type == "int") || (Type == "double") /* || () || ... - все стандартные типы */)
    WriteStandart(Value);
  else
    WriteStruct(Value);  
}

void OnStart()
{
  MqlTick Tick;
  int Num;
  
  Write(Num);
  Write(Tick);  
}
Если компилятор хорош, то должен сделать очень эффективный код - без проверок if.
 
fxsaber:
template<typename T>
void WriteStruct( T& Value ) { Print(__FUNCSIG__); }

template<typename T>
void WriteStandart( T& Value ) { Print(__FUNCSIG__); }

template<typename T>
void Write( T& Value )
{
  const string Type = typename(T);

  if ((Type == "int") || (Type == "double") /* || () || ... - все стандартные типы */)
    WriteStandart(Value);
  else
    WriteStruct(Value);  
}

void OnStart()
{
  MqlTick Tick;
  int Num;
  
  Write(Num);
  Write(Tick);  
}
Если компилятор хорош, то должен сделать очень эффективный код - без проверок if.

Всё дело в том, что эти функции -пустышки.  А попробуйте-ка в WriteStruct обратиться к полям структуры, либо в WriteStandart произвести какое-то действие с числовой переменной.  Ваши иллюзии вмиг рассеятся :)

Как я уже говорил, разделять типы нужно на уровне компилятора.  А в рантайме это можно сделать лишь в том случае, если типы приводятся друг к другу. В данном же случае int и MqlTick несовместимы. 

 
Alexey Navoykov:

Нет, в первом ответе предложили совсем другое.  Там речь шла о шаблонах классах, которых на тот момент даже ещё не было в MQL.  Видимо тот человек был такой же, как Комбинатор, прилетевший из будущего :) 

Ничего подобного. Мой ответ был абсолютно рабочим на момент написания.
 
Alexey Navoykov:

Всё дело в том, что эти функции -пустышки.  А попробуйте-ка в WriteStruct обратиться к полям структуры, либо в WriteStandart произвести какое-то действие с числовой переменной.  Ваши иллюзии вмиг рассеятся :)

Как я уже говорил, разделять типы нужно на уровне компилятора.  А в рантайме это можно сделать лишь в том случае, если типы приводятся друг к другу. В данном же случае int и MqlTick несовместимы. 

Да, не получится.
 
Stanislav Korotky:
Ничего подобного. Мой ответ был абсолютно рабочим на момент написания.

Рабочим где?  В С++? :)

В MQL шаблоны классов появились лишь в октябре-ноябре прошлого года, а ваш пост был годом ранее.

Да и, честно говоря, не очень понятно, что вы там конкретно предлагали.  Почему бы не пояснить всё кодом, вместо словесного описания.

 
Для чего изначально понадобилось такое различие функций Write?
 
Alexey Navoykov:

Рабочим где?  В С++? :)

В MQL шаблоны классов появились лишь в октябре-ноябре прошлого года, а ваш пост был годом ранее.

Да и, честно говоря, не очень понятно, что вы там конкретно предлагали.  Почему бы не пояснить всё кодом, вместо словесного описания.

Конечно в MQL. В ответе есть одна опечатка - должно быть написано: "реализовать классы обертки для стандартных типов и генерить шаблонные методы по первому случаю". Теперь стало понятно? Хотя конечно накладно для каждого стандартного типа полную объектную обертку писать.
 

Например, делаете базовый класс:

class Variant
{
  public:
    virtual bool write() const
    {
      return false;
    }
};

от него наследуете Double, Long и прочие классы, включая и Struct (содержащий структуру). Тогда вызов шаблонной Write(T) можно заменить на виртуальный t.write().
 

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