Можно ли наращивать количество аргументов функции?Можно ли вернуть количество аргументов функции?

 

К примеру есть примитивная запись

int Funk(bool Er,int q1,int q2,int q3)
{return 0;}

В данной записи объявлены аргументы int q1,int q2,int q3. При расчётах так получилось что нужно использовать алгоритм этой функции, но количество параметров типа int уже больше. Значения этих параметров будут передаваться в массив и использоваться непосредственно в программе. Что можно сделать в этом случае?
Ну отсюда возникает второй вопрос каким способом можно узнать сколько у функции аргументов в моём случае четыре (bool Er,int q1,int q2,int q3)? Как провести проверку и узнать сколько у функции параметров. Просьба не грубить я конечно валенок но мне очень нужны подобные свойства для написания программ. Возможно ли что-то из этого реализовать? Вот у меня есть пример кода.

template<class T> void Fun(T a[], size_t args...)
{}
int main()
{
int *mas1[2][2] = { {1,4},{2,6} };
int mas2[2][2][2];
Fun(*mas1, 2, 2);     //количество аргументов 3
Fun(**mas2, 2, 2, 2);//количество аргументов 4
}

Правда код этот не из mql4. Что можно сделать чтобы реализовать подобное и возможно ли это?

 

Нет такой возможности. 

Можно выйти из положения следующим образом: не передавать все параметры сразу, а передавать их по одному. Лучше сделать в виде класса с тремя методами. Вызов одного метода означает начало добавления данных в массив, второй метод используется для добавления одного значения (вызывается несколько раз), третий метод - для окончания добавления. Примерно так.

 

Как я вижу варианты следующие:

1. Объявить функцию с максимальным числом параметров, задав их по умолчанию таким значением, которое не может быть передано. Соответственно, при вызове - передаешь только необходимое число, остальные - принимают значения по умолчанию. Внутри функции - проверяешь, сколько реально передано значений.

2. Передавать параметры внутри динамического массива.

3. Передавать параметры в специальном классе-контейнере, который знает число и тип параметров. Лично я использую последний случай (для передачи параметров различных индикаторов), он хорош тем, что параметры могут быть самыми разными. Более того, я передаю в функцию базовый класс-интерфейс, где все функции получения параметров виртуальны, а их реализация - уже зависит от конкретного набора параметров, необходимых для данного индикатора..  

 
Seric29:

К примеру есть примитивная запись

В данной записи объявлены аргументы int q1,int q2,int q3. При расчётах так получилось что нужно использовать алгоритм этой функции, но количество параметров типа int уже больше. Значения этих параметров будут передаваться в массив и использоваться непосредственно в программе. Что можно сделать в этом случае?
Ну отсюда возникает второй вопрос каким способом можно узнать сколько у функции аргументов в моём случае четыре (bool Er,int q1,int q2,int q3)? Как провести проверку и узнать сколько у функции параметров. Просьба не грубить я конечно валенок но мне очень нужны подобные свойства для написания программ. Возможно ли что-то из этого реализовать? Вот у меня есть пример кода.

Правда код этот не из mql4. Что можно сделать чтобы реализовать подобное и возможно ли это?

Примерно так

int Funk(bool Er,int q1,int q2,int q3)
{return 0;}

int Funk(bool Er,int q1,int q2,int q3,int q4)
{return 0;}

int Funk(bool Er,int q1,int q2,int q3,int q4,int q5)
{return 0;}

int Funk(bool Er,int q1,int q2,int q3,int q4,int q5,int q6)
{return 0;}

Дальше сколько параметров передаёшь в функцию при её вызове, та функция и работает. Это самое простое.

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

 

зависит от желания создать сложную конструкцию и поставленных задач

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

ЗЫ: нужно понимать, что если бы все исходники на разных языках программирования могли бы портироваться "в 2 клика" без потери функциональности или усложнения кода, тогда не было бы такого изобилия языков - это просто не нужно

 
Georgiy Merts:

Как я вижу варианты следующие:

1. Объявить функцию с максимальным числом параметров, задав их по умолчанию таким значением, которое не может быть передано. Соответственно, при вызове - передаешь только необходимое число, остальные - принимают значения по умолчанию. Внутри функции - проверяешь, сколько реально передано значений.

2. Передавать параметры внутри динамического массива.

3. Передавать параметры в специальном классе-контейнере, который знает число и тип параметров. Лично я использую последний случай (для передачи параметров различных индикаторов), он хорош тем, что параметры могут быть самыми разными. Более того, я передаю в функцию базовый класс-интерфейс, где все функции получения параметров виртуальны, а их реализация - уже зависит от конкретного набора параметров, необходимых для данного индикатора..  

1ый вар. я реализовал но минус его в том что происходят лишние проверки.

2ой вар. тут получается в принципе всё нормально но если объявить массив глобально то приходится разрывать условие if заполнять массив потом заходить опять в логич. условие if и уже дальше доделывать работу это тоже не удобно лишние проверки но работать с динамическим массивом очень удобно можно сразу обращаться к нужному размеру в цикле. Было бы класно если бы можно было заполнить динамический массив данными без разрыва логического условия.

3ий вапр. в классах я валенок сколько я их не изучал так и не понял их сути, я только понял что оин данные объединяют но какой в этом толк и чем они отличаются от фабричной функции я так и не понял.

 
Igor Makanu:

зависит от желания создать сложную конструкцию и поставленных задач

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

ЗЫ: нужно понимать, что если бы все исходники на разных языках программирования могли бы портироваться "в 2 клика" без потери функциональности или усложнения кода, тогда не было бы такого изобилия языков - это просто не нужно

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

if(q==5&& ww==2||ty=5;Fun()){}
int ty=0,qw=0;if(ty==0||(qw=5&&qw!=0)){} так тоже нельзя
 
Seric29:

1ый вар. я реализовал но минус его в том что происходят лишние проверки.

2ой вар. тут получается в принципе всё нормально но если объявить массив глобально то приходится разрывать условие if заполнять массив потом заходить опять в логич. условие if и уже дальше доделывать работу это тоже не удобно лишние проверки но работать с динамическим массивом очень удобно можно сразу обращаться к нужному размеру в цикле. Было бы класно если бы можно было заполнить динамический массив данными без разрыва логического условия.

3ий вапр. в классах я валенок сколько я их не изучал так и не понял их сути, я только понял что оин данные объединяют но какой в этом толк и чем они отличаются от фабричной функции я так и не понял.

1-2. Если ты хочешь функцию с переменным числом параметров - проверки в любом случае будут нужны. Просто в случае параметров, ты проверяешь сами параметры, в случае массива - проверяешь массив.

3. Это ООПшная фишка. Главная польза от классов - в связи данных и функций, их обрабатывающих, а также в инкапсуляции - пользователи классов имеют доступ только к тому, что им в данный момент надо, тем самым исключается возможность влияния на какие-то другие блоки приложения. Чтобы увидеть пользу от ООП-классов, надо работать с достаточно сложными структурами данных, выстроенных в иерархию. Если используются простые структуры данных, и не сильно развитая архитектура приложения - смысла городить ООП-навороты никакого нет.

 
Georgiy Merts:

1-2. Если ты хочешь функцию с переменным числом параметров - проверки в любом случае будут нужны. Просто в случае параметров, ты проверяешь сами параметры, в случае массива - проверяешь массив.

Понятно. Я люблю работать с массивами очень удобно особенно с динамическими взял весь размер и проверок почти нет. В с++ хорошие возможности,

template<typename...Args>
void test(const Args&...args)
{
    const std::size_t size=sizeof...(args);
    int array[size]={args...};
    for(std::size_t pos=0;pos<size;++pos)
        std::cout<<array[pos]<<std::endl;
}
 
int main()
{
    test(1,2,3,4);
    return 0;
}

В функции создаётся сразу и размер и сразу можно загнать любое количество параметров но одного типа да это в принципе и нужно сделать, но есть одна проблема я использую шаблоны и в этом случае для передачи информации в функцию библиотеки нужно указать тип функции а это уже неудобно, можно было бы написать 2 библиотеки одну родную на mqh, вторую в с++, в mqh возвращать типы а во второй считать, но можно ли передавать шаблоны в mqh я тоже не знаю.