Скачать MetaTrader 5

Попытка реализации функции IsPointer

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Хочешь написать технический индикатор? Загляни в Справочник MQL5!
Ilya Prozumentov
275
Ilya Prozumentov 2016.09.04 22:33 
Здравствуйте.
Как описать функцию, которая должна определить тип данных, с которым работает класс? И как в эту функцию передать сам тип данных, но не в виде строки, а что бы можно было использовать константы перечисления ENUM_DATATYPE
В данном случае важно лишь различать указатель любого типа от всего прочего.
ENUM_DATATYPE, в качестве типа переменной type - компилятор не пропускает
bool IsPointer(ENUM_DATATYPE type)
{
   switch(type)
   {
      case TYPE_BOOL: return(false);
      case TYPE_CHAR: return(false);
      case TYPE_UCHAR: return(false);
      case TYPE_SHORT: return(false);
      case TYPE_USHORT: return(false);
      case TYPE_COLOR: return(false);
      case TYPE_INT: return(false);
      case TYPE_UINT: return(false);
      case TYPE_DATETIME: return(false);
      case TYPE_LONG: return(false);
      case TYPE_ULONG: return(false);
      case TYPE_FLOAT: return(false);
      case TYPE_DOUBLE: return(false);
      case TYPE_STRING: return(false);
      default : return(true);
   }
}
Vitalie Postolache
12135
Vitalie Postolache 2016.09.05 09:36  
SunnYtheDreamer:
Здравствуйте.
Как описать функцию, которая должна определить тип данных, с которым работает класс? И как в эту функцию передать сам тип данных, но не в виде строки, а что бы можно было использовать константы перечисления ENUM_DATATYPE
В данном случае важно лишь различать указатель любого типа от всего прочего.
ENUM_DATATYPE, в качестве типа переменной type - компилятор не пропускает

И не пропустит, ENUM_DATATYPE из MQL5 так-то, в 4 нет такого перечисления. Или форум не тот выбрали?
Ilya Prozumentov
275
Ilya Prozumentov 2016.09.05 10:58  
evillive:
И не пропустит, ENUM_DATATYPE из MQL5 так-то, в 4 нет такого перечисления. Или форум не тот выбрали?
Есть в MQL4 это перечисление, начинаю набирать и в подсказках оно предлагается, и константы этого перечисления в коде можно использовать - работают.
LRA
336
LRA 2016.09.05 14:37  
SunnYtheDreamerENUM_DATATYPE
В указанную функцию можно передать лишь идентификаторы, перечисленные в ENUM_DATATYPE, или числа от 1 до 14, что одно и то же. К типам (bool, int, ...) эти значения никакого отношения не имеют. Поэтому функция всегда возвращает false. Чтобы она работала шире, нужно создать свой enum и включить в него другие требуемые значения параметра.
Ilya Prozumentov
275
Ilya Prozumentov 2016.09.05 17:27  
LRA:
В указанную функцию можно передать лишь идентификаторы, перечисленные в ENUM_DATATYPE, или числа от 1 до 14, что одно и то же. К типам (bool, int, ...) эти значения никакого отношения не имеют. Поэтому функция всегда возвращает false. Чтобы она работала шире, нужно создать свой enum и включить в него другие требуемые значения параметра.
В таком случае enum нужно заменить на что-то другое т. к. все требуемые значения предусмотреть невозможно. Мне известно, что можно описать так:
bool IsPoiter(const string type)
{
   if(type =="int") return(false);
   ...
   return(true);
}
Но я сознательно хочу уйти от сравнения строк т. к. считаю, что сравнение строк требует больше времени. При этом возникает проблема передачи самого параметра в функцию, при её вызове. С реализацией сравнения строк ясно, что вызов функции выглядит так:
IsPointer(typename(T1))
а если уйти от строк, то, как должен будет выглядеть вызов функции? Возможен ли другой способ реализации, в обход сравнения строк?
LRA
336
LRA 2016.09.06 16:33  
SunnYtheDreamer:  другой способ реализации ... ?
void OnStart()
{
  Тип(1255.0);
  Тип(1255);
}

void Тип(int Параметр)     // Ну это пример. Вместо void надо bool и возвращать true false
{
   Alert(Параметр, " - целое число");
}

void Тип(double Параметр)
{
   Alert(Параметр, " - число двойной точности");
}

Перегрузка функций – это создание нескольких функций с одним именем, но с разными параметрами

Ilya Prozumentov
275
Ilya Prozumentov 2016.09.06 17:27  
LRA:

Перегрузка функций

Есть проблема: перегрузка не принимает указатели на классы, которые не принадлежат к семейству классов CObject
LRA
336
LRA 2016.09.06 18:53  
SunnYtheDreamerперегрузка не принимает указатели на классы, которые не принадлежат к семейству классов CObject

Приведите простейший пример такого указателя

То, что Вы делаете, имеет отношение к профиту? Или Вы, как я в детстве, стремитесь познать всю глубину данного языка программирования? ИХМО, искусство программирования не в глубочайшем знании языка (на это есть справка F1), а в умении изящно описать сложный алгоритм сочетанием простых средств.

Алексей Тарабанов
7214
Алексей Тарабанов 2016.09.06 21:55  

"...Как описать функцию, которая должна определить тип данных, с которым работает класс? И как в эту функцию передать сам тип данных..." 

Старею...  

Ilya Prozumentov
275
Ilya Prozumentov 2016.09.07 10:07  
LRA:

Приведите простейший пример такого указателя

class Color
{
...
};

Color *pointer = new Color();

LRA:

То, что Вы делаете, имеет отношение к профиту?

Я намерен сделать так, что бы у меня был описан и подключен один единственный класс: ArrayList<любой тип данных>, а не зоопарк из CArrayDouble, CArrayInt и т. д.
LRA:

ИХМО, искусство программирования не в глубочайшем знании языка (на это есть справка F1), а в умении изящно описать сложный алгоритм сочетанием простых средств.

Как раз таки я и пытаюсь описать сложный алгоритм, а сложность его в том, что он должен обработать любой тип данных.
LRA
336
LRA 2016.09.07 11:17  
SunnYtheDreamer:
Я намерен сделать так, что бы у меня был описан и подключен один единственный класс: ArrayList<любой тип данных>, а не зоопарк из CArrayDouble, CArrayInt и т. д.
Как раз таки я и пытаюсь описать сложный алгоритм, а сложность его в том, что он должен обработать любой тип данных.

Вот Ваш класс прекрасно перегрузился

#property strict

class Color
{
  int x;
};

void OnStart()
{
  Color *pointer = new Color();

  if(Тип(1255.0)) Alert("Указатель");
  if(Тип(1255)) Alert("Указатель");
  if(Тип(pointer)) Alert("Указатель");
}

bool Тип(Color* Параметр)
{
   Alert("Параметр - указатель на Color");
   return true;
}

bool Тип(int Параметр)
{
   Alert(Параметр, " - целое число");
   return false;
}

bool Тип(double Параметр)
{
   Alert(Параметр, " - число двойной точности");
   return false;
}
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий