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

 

В один шаблон загонять и обычные переменные и структуры - и в страшном сне такой потребности нее возникнет.

Один вопрос - зачем?

 
Dmitry Fedoseev:

В один шаблон загонять и обычные переменные и структуры - и в страшном сне такой потребности нее возникнет.

Один вопрос - зачем?

Например, для этого.

TypeToBytes
TypeToBytes
  • голосов: 16
  • 2016.09.13
  • //www.mql5.com/ru/users/fxsaber">
  • www.mql5.com
Побайтовая работа со структурами и стандартными типами данных
 
fxsaber:

Например, для этого.

Для "этого" вы справились другими методами (поскоько вопрос темы не решен, а "это" имеется).  

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

 
Dmitry Fedoseev:
Тебя барабашка покусал?
 
Dmitry Fedoseev:

Для "этого" вы справились другими методами (поскоько вопрос темы не решен, а "это" имеется).  

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

"В один шаблон загонять и обычные переменные и структуры" бывает удобно

  MqlTick Tick;
  ::SymbolInfoTick(::Symbol(), Tick);

  MqlTick CloneTick = Tick;

// Работа со структурами
  if (_R(Tick) == CloneTick)             // Теперь структуры можно сравнивать
    ::Print("Equal");

// Получения значения требуемого типа по смещению
  PRINT(_R(Tick)[(datetime)0])           // Смотрим значение datetime по нулевому смещению в объекте структуры MqlTick - Tick.time

// Получение смещения поля структуры
  const int Offset = _OFFSET(Tick, bid); // Нашли смещение в байтах поля bid в объекте структуры MqlTick

  PRINT(Tick.bid)                        // Посмотрели значение Tick.bid
  _W(Tick)[Offset] = 1.23456;            // Записали по найденному смещению значение (double)1.23456

  PRINT(Tick.bid)                        // Убедились, что Tick.bid теперь равен 1.23456

// Работа со стандартными типами
  color Color = C'241,248,255';

  PRINT(_R(Color)[(uchar)1])             // Green-составляющая цвета - 248

  _W(Color)[2] = (uchar)230;             // Записали по смещению 2 значение (uchar)230.
  PRINT(Color)                           // Убедились, что Color теперь C'241,248,230'

// Одновременная работа со смешанными типами
  if (_R(Tick) != Color)                 // Можно сравнивать даже структуры со стандартными типами
    ::Print("Not equal");


 

 
Общий принцип понятен. Если задачу можно придумать, то должен существовать способ ее решения.
 
Alexey Navoykov:

А теперь, господа знатоки, внимание, правильный ответ:

// Отдельно для каждого типа
class A
{
public:  
  template <typename T>
  static void Write( T &Value ) { Func(Value); } // иногда бывает полезна не полная синтаксическая запись (A:: или this.)

  static void Func( int &Value ) { Value = 1; }
  static void Func( string &Value ) { Value = "Hello!"; }
};

// Для оставшихся типов
template <typename T>
void Func( T &Value ) { Value.bid = 123; }

template <typename T>
void Write( T &Value ) { A::Write(Value); }

void OnStart()
{
  int a;
  MqlTick Tick;
  string Str;
  
  Write(a);
  Write(Tick);
  Write(Str);
  
  Print(a);
  Print(Tick.bid);
  Print(Str);
}

Фактически, это то же самое, что у Вас. Только у меня наследование идет от базового класса "::".

Как-то раньше не доходил до той абстракции, что ВСЕ классы являются наследниками статического класса "::".

 
Stanislav Korotky:

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

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

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

Т.е. данные хранить изначально в классах?  Ну тогда конечно вопросов бы не возникало.   А речь шла именно о нативных данных.
 
fxsaber:
Фактически, это то же самое, что у Вас. Только у меня наследование идет от базового класса "::".

Как-то раньше не доходил до той абстракции, что ВСЕ классы являются наследниками статического класса "::".

Ну тут чё-то слишком запутано получается.  Зачем оно надо то
 
Alexey Navoykov:
Ну тут чё-то слишком запутано получается.  Зачем оно надо то
О чем речь?