Функции с неопределенным количеством аргументов - страница 2

 
Maxim Kuznetsov:

что-же вы так мучаетесь :-)

log<<StringFormat("formatted message %d %d",10,11)<<0.55<<ChartID()<<log.flush

чем не вариант ?

Тем что в моей функции есть несколько проверок условий. Информация на диск скидывается если логов записали уже достаточно много.

 
pivomoe:

Мне нужно научить Log.write писать в файл произвольное количество параметров произвольных типов. Точно также как Print пишет в журнал. А сейчас как то не хорошо получается. Мне приходиться и переменную   объявлять и фукцию для склеивания вызывать. Вообще как это очень длинно. Хочется вот так.


Попробуйте использовать шаблоны (templates) или же нужно объявить функцию, у которой все входные параметры имеют тип string. Тогда любой тип будет автоматически конвертироваться в строку, как у Print().
 

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

void Print_( string s1 = "", string s2= "", ..... , string s64 = "")
 
Mislaid:

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

64 максимум или рядом. И формат со значениями по умолчанию очень неудобен.

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

 
Какой бы сложности не делал распечатки через Print, всегда использовал один аргумент.
 
Ihor Herasko:

Попробуйте использовать шаблоны (templates)

Спасибо. Именно шаблоны я и искал.

Ihor Herasko:

или же нужно объявить функцию, у которой все входные параметры имеют тип string. Тогда любой тип будет автоматически конвертироваться в строку, как у Print().

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

void F(string str1,string str2="",string str3="")
{
 Print (str1,str2,str3);
}


    F(5,"ddd",5.0);
 
pivomoe:

Спасибо. Именно шаблоны я и искал.

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

Динамические массивы не пробовали использовать.
void F (string &arg[])
{
   for (int i=0;i<=ArraySize(arg)-1;i++)
   {
      Print(arg[i]);
   }
}

string Arr[]; ArrayResize(Arr,3);

int B = 1;

double D = 2.0;

Arr[0] = "0"; Arr[1] = (string)B; Arr[2] = (string)D;

F(Arr);

 
Vitalii Ananev:
Динамические массивы не пробовали использовать.


Можно даже сделать для разных типов данных, тогда не нужно явное приведение типов.

void F (string &arg[])
{
   for (int i=0;i<=ArraySize(arg)-1;i++)
   {
      Print(arg[i]);
   }
}
void F (int &arg[])
{
   for (int i=0;i<=ArraySize(arg)-1;i++)
   {
      Print(arg[i]);
   }
}
void F (double &arg[])
{
   for (int i=0;i<=ArraySize(arg)-1;i++)
   {
      Print(arg[i]);
   }
}
string SArr[];
ArrayResize(SArr,3);
int IArr[];
ArrayResize(IArr,3);
double DArr[];
ArrayResize(DArr,3);
SArr[0]="0"; SArr[1]="1";SArr[2]="2";
IArr[0]=0; IArr[1]=1;IArr[2]=2;
DArr[0]=0; DArr[1]=1.0;DArr[2]=2.0;
F(SArr);
F(IArr);
F(DArr);
 
pivomoe:

Тем что в моей функции есть несколько проверок условий. Информация на диск скидывается если логов записали уже достаточно много.

В чём проблема ? вы не умеете делать внутренние буферы, что-ли..

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

PS/ кстати особенность логов от всякого прочего - они на диск скидываются СРАЗУ как только готова хоть одна запись. Их цель - максимально гарантировать фиксацию чего-то там, вне зависимости от упадёт программа на следующей строчке или нет.

 
Maxim Kuznetsov:

 вы не умеете делать внутренние буферы, что-ли..


Если честно то нет. На mql5 вроде нет его описания.

Вы ранее писали

log<<StringFormat("formatted message %d %d",10,11)<<0.55<<ChartID()<<log.flush


Я так и не понял что такое log в вашем примере. Это переменная какого то класса, в котором перегружен оператор << ?

Причина обращения: