Функция, структура, класс с переменным количеством параметров

 
Возможно ли такое, при том, что эти параметры могут быть из разных встроенных MQL5 типов (int, double, bool, ENUM_...).
 

А документацию почитать? Я только-что читал об этом. Делаешь конструкторы с разным набором параметров и все дела.

Или вопрос в чём-то другом?

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
 
Alexey Viktorov:

А документацию почитать? Я только-что читал об этом. Делаешь конструкторы с разным набором параметров и все дела.

Или вопрос в чём-то другом?

Количество параметров неизвестно заранее, поэтому нельзя под каждый случай сделать конструктор с определённым набором параметров.

 
Vladimir Karputov:

Количество параметров неизвестно заранее, поэтому нельзя под каждый случай сделать конструктор с определённым набором параметров.

На C# я такое делал, там при разборе можно получить тип передаваемого параметра. В MQL4/5 ведь такого нет. 

Можно попробовать извратится и сделать типа такого. Но я не пробовал. То есть передавать массив указателей на классы, производные от CBase, при этом они кастятся к CBase*.  Вроде должно сработать

enum TYPE_VAR {EInteger, EDouble,......, EEnd}

class CBase
{
public:
    TYPE_VAR type;
}

class DataDouble : public CBase
{
public:
    double d;
}

bool NextDay(CBase* &arr[])
{
}

void OnStart()
{
}
 
Alexey Volchanskiy:

На C# я такое делал, там при разборе можно получить тип передаваемого параметра. В MQL4/5 ведь такого нет. 

Можно попробовать извратится и сделать типа такого. Но я не пробовал. То есть передавать массив указателей на классы, производные от CBase, при этом они кастятся к CBase*.  Вроде должно сработать

Есть ведь пример передачи параметров в индикаторы.
 
Alexey Volchanskiy:

На C# я такое делал, там при разборе можно получить тип передаваемого параметра. В MQL4/5 ведь такого нет. 

Можно попробовать извратится и сделать типа такого. Но я не пробовал. То есть передавать массив указателей на классы, производные от CBase, при этом они кастятся к CBase*.  Вроде должно сработать

В MQL5 нельзя такое:

int Func(int a,...)
  {

  }
 
Vladimir Karputov:

В MQL5 нельзя такое:

Я разве писал о таком??? Я писал

bool Function(CBase* &arr[])
 
Alexey Volchanskiy:

Я разве писал о таком??? Я писал

А я увидел это:

поэтому сразу и уточнил.

Но это лирика, пока вроде нет способа задать переменное количество разнотипных параметров.
 
Vladimir Karputov:

А я увидел это:

поэтому сразу и уточнил.

Но это лирика, пока вроде нет способа задать переменное количество разнотипных параметров.

А-а, ну это я просто не стал расписывать все типы параметров ))) Поставил многоточие. Вспомнил, у меня был подобный случай на MQL, я просто все типы данных передавал в массиве, как double. Ведь потом из double можно обратно каститься на любой тип данных.

 

Решение оказалось уже есть: Структура входных параметров индикатора

struct MqlParam 
  { 
   ENUM_DATATYPE     type;                    // тип входного параметра, значение перечисления ENUM_DATATYPE 
   long              integer_value;           // поле для хранения целочисленного значения 
   double            double_value;            // поле для хранения значения double или float 
   string            string_value;            // поле для хранения значения строкового типа 
  };

И пример заполнения массива структур MqlParam для iMACD:

      //--- заполним структуру значениями параметров индикатора      
      MqlParam pars[4]; 
      //--- быстрый период 
      pars[0].type=TYPE_INT; 
      pars[0].integer_value=fast_ema_period; 
      //--- медленный период 
      pars[1].type=TYPE_INT; 
      pars[1].integer_value=slow_ema_period; 
      //--- период усреднения разницы между быстрой и медленной средними 
      pars[2].type=TYPE_INT; 
      pars[2].integer_value=signal_period; 
      //--- тип цены 
      pars[3].type=TYPE_INT; 
      pars[3].integer_value=applied_price; 
      handle=IndicatorCreate(name,period,IND_MACD,4,pars); 
 
Vladimir Karputov:
Возможно ли такое, при том, что эти параметры могут быть из разных встроенных MQL5 типов (int, double, bool, ENUM_...).

Возможно. И не только из встроенных, но и кастомных типов.