Можно ли определить тип переменной или элемента в mql4? - страница 2

 
Igor Makanu:

Я ниже написал комментарий могли бы вы посмотреть и сказать своё мнение о задумке.

 
Artyom Trishkin:

Как-то менее замысловато можно вопрос задать? Ничего не понял.

Я ниже написал что хочу сделать чего добиться вы могли бы посмотреть мою задумку.

 
Dmitry Fedoseev:

При помощи перегрузки можно

У меня есть функция которая двигает массивы и я указываю для неё аргументы, я хотел сделать технологию чтобы функция могла автоматически определить тип массива и не нужно было ставить какой это массив, пришла такая идея что может каким-нибудь образом сделать сноску или что такое и вызывать эту сноску и будет происходить самоопределение типа массива. Например 

void Sdv(int &mas[][],double &mas1[],double &mas2[][],datetime &mas3[][],int qt)
{
Расчёты
}
Записываем таким образом
void Sdv("сноска на тип" &mas[][],"сноска на тип" &mas1[],"сноска на тип" &mas2[][],"сноска на тип" &mas3[][],int qt)
{
Расчёты
}

Поэтому я и задаю такие странные вопросы.

 
Seric29:

Поэтому я и задаю такие странные вопросы.

не странные, а не имеющие конкретного применения, есть конкретная цель, значит нужна реализация, ну каков вопрос, таков ответ, с массивами сомневаюсь, что так просто будет, с классами можно, примерно так:

template<typename T>
class CData
  {
public:
                     CData()     {  };
                    ~CData()     {  };
   T                 arr[];
   int               Total()     { return(ArraySize(arr));  }    
   void              typeof()    { Print(typename(T));      }

  };
//+------------------------------------------------------------------+
void OnStart()
  {
      CData<int>     *dataint    = new CData<int>;
      CData<double> *datadouble  = new CData<double>;
      dataint.typeof();
      datadouble.typeof();
      
      delete dataint;
      delete datadouble;
  }
//+------------------------------------------------------------------+

дальше экспериментируйте, что и как

 
Seric29:

У меня есть функция которая двигает массивы и я указываю для неё аргументы, я хотел сделать технологию чтобы функция могла автоматически определить тип массива и не нужно было ставить какой это массив, пришла такая идея что может каким-нибудь образом сделать сноску или что такое и вызывать эту сноску и будет происходить самоопределение типа массива. Например 

Поэтому я и задаю такие странные вопросы.

Нормальные вопросы. Задавайте и темы создавайте.

Это делается за счет так называемой перегрузки имени функции. Не надо в одной функции определять, нужно написать несколько функций с одинаковыми именами, но с разными наборами параметров. Показано здесь и здесь

 
Seric29:

У меня есть функция которая двигает массивы и я указываю для неё аргументы, я хотел сделать технологию чтобы функция могла автоматически определить тип массива и не нужно было ставить какой это массив, пришла такая идея что может каким-нибудь образом сделать сноску или что такое и вызывать эту сноску и будет происходить самоопределение типа массива. Например 

Поэтому я и задаю такие странные вопросы.

Используйте шаблоны:

template<typename T>
void MoveArray(T &array[])
{

}

...

struct MyStruct
{
};

double doubleArray[];
int intArray[];
datetime dtArray[];
MyStruct stArray[];
...
MoveArray(doubleArray);
MoveArray(intArray);
MoveArray(dtArray);
MoveArray(stArray);
 
Ihor Herasko:

Используйте шаблоны:

Было бы класно если бы вы комментировали что происходит на этих строчках.К примеру

template<typename T> тут понятно объявлен шаблон
void MoveArray(T &array[])что происходит тут. Здесь описывается функция то что она будет делать да или что тут происходит? Она принимает внутрь 
                          себя шаблон, его параметры сколько параметров принимает эта функция 1 параметр? Она принимает массив любого типа указанный
                          в шаблоне? В зависимости от аргументов функции будет принято количество массивов с которыми она будет работать или будет принят
                          весь шаблон.

{
Здесь я так понял производятся
расчёты функции которая будет крутить массивы или что-то делать.
}

...

struct MyStruct объявили структуру но внутри всё пусто тело пустое, обычно что-то должно там быть где оно рассчитывается или описание параметров? Я так понял
                описание параметров ниже под структурой.        
{
};

double doubleArray[];здесь я так понял и происходит самое интересное.
int intArray[];
datetime dtArray[];

MyStruct stArray[]; 
...
MoveArray(doubleArray);
MoveArray(intArray);
MoveArray(dtArray);
MoveArray(stArray);
Покажите как вызвать функцию в которую будут передоваться параметры и как будут заполнятся аргументы этой функции. Предположим нам нужно вызвать 
функцию покажите как это происходит?
 
Seric29:

Было бы класно если бы вы комментировали что происходит на этих строчках.К примеру

Если еще не сталкивались с шаблонами, то можно посмотреть описание вот здесь. Вроде бы достаточно доходчиво написано. И коротко, к тому же.

объявили структуру но внутри всё пусто тело пустое

Просто показал, что массив может быть не только из данных простого типа, но также и из структур.

Покажите как вызвать функцию в которую будут передоваться параметры и как будут заполнятся аргументы этой функции

Вот же примеры вызова:

MoveArray(doubleArray);
MoveArray(intArray);
MoveArray(dtArray);
MoveArray(stArray);

Смысл шаблона в том, что не нужно для каждого используемого типа писать свою функцию. Это сделает компилятор, когда обнаружит вызов функции, исходя из типов аргументов, с которыми она вызвана.

 

Может быть так сделать?

enum ARR_TYPE
{
  ARR_INT,
  ARR_DOUBLE,
  ARR_STRING
};  
  
struct MY_ARRAY
{
  ARR_TYPE arr_type;
  double Mass[];
};  

MY_ARRAY m_arr;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  m_arr.arr_type = ARR_DOUBLE;
  ArrayResize(m_arr.Mass, 100); 
  return(INIT_SUCCEEDED);
}
 

Наиболее распространенный пример шаблонных функций - это как раз работа с массивами. Массивы могут иметь различный тип, а реализация действий с ними - одна и та же.

Вот так можно добавить новый элемент к массиву любого типа:

#define ARRAY_RESERVE_SIZE   100

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Добавление нового элемента в массив                                                                                                                                                               |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
template<typename T>
bool AddElementToArray(T& arrT[], const T& tElement)
{
   int nTotal = ArraySize(arrT);
   if (ArrayResize(arrT, nTotal + 1, ARRAY_RESERVE_SIZE) != nTotal + 1)
   {
      Alert(MQLInfoString(MQL_PROGRAM_NAME), ": error while adding the element to array of ", typename(T), " type.");
      return false;
   }
   
   arrT[nTotal] = tElement;
   return true;
}

Вызов для  массивов различных типов:

struct MyStruct
{
   datetime dtTime;
   double   fPrice;
};

   int intArray[];
   double dArray[];
   MyStruct stArray[];
   
   int a = 10;
   double b = 1.5;
   
   MyStruct stPoint = {D'2018.01.01', 12.0};
   
   if (!AddElementToArray(intArray, a))
      return;
      
   if (!AddElementToArray(dArray, b))
      return;
      
   if (!AddElementToArray(stArray, stPoint))
      return;
Причина обращения: