MT5: переменное число аргументов функции - страница 3

 
Andrei Trukhanovich #:

так она и не на mql написана.

В самописном придется писать 64 варианта функции похоже

Больше. Намного больше. Если взять только int, double, bool, string, то уже получается 4 в 64 степени вариантов. Перебор всего совсем не вариант.

 
Maxim Kuznetsov #:

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

Я не пишу "фичу" - это чисто моя "хотелка". Локальная.
И, кстати, подобные вещи как раз и помогают в тех же логах. Или в выводе текста из консоли в файл..
Если вам это не интересно/не нужно, то не нужно считать, что не нужно никому. Здесь не ЛОР, вроде. :)

 
SimpleUser #:

Вы либо издеваетесь, либо я на каком то другом языке разговариваю.
Допустим есть код

Я хочу просто, не меняя особо кода заменить его на

Выше подключается моя библиотека, в которой и реализована эта функция f_Print
А потом, я просто автозаменой меняю f_Print на Print, удаляю подключение своей библиотеки и получаю обычный код.
Да, задача специфичная. На современном c++ я бы это сделал просто, а вот здесь - проблема

Понятно что вы хотите. Но я просто показал что такой код дает ошибки, хотя с какого перепуга не понятно

template<typename T1,
         typename T2,
         typename T3>
void _Print(const T1 sString1, 
            const T2 sString2 = NULL,
            const T3 sString3 = NULL)
{
   Print(sString1, sString2, sString3);
}

void test()
{
   int x = 5;
   _Print("xxx");
   _Print("xxx ", x);
   _Print(x, " xxx ", 12345);
}

А такой нормально компилируется и отрабатывает

void _Print(const string sString1, 
            const string sString2 = NULL,
            const string sString3 = NULL)
{
   Print(sString1, sString2, sString3);
}

void test()
{
   int x = 5;
   _Print("xxx");
   _Print("xxx ", (string)x);
   _Print((string)x, " xxx ", (string)12345);
}
 
SimpleUser #:

Больше. Намного больше. Если взять только int, double, bool, string, то уже получается 4 в 64 степени вариантов. Перебор всего совсем не вариант.

так шаблоны же эту работу за вас сделают, так что 64 варианта. Возможно что-то типа есть в библиотеках у fxsaber, посмотрите

 
Konstantin Nikitin #:

А такой нормально компилируется и отрабатывает

Я не спорю, что он отрабатывает. Только в вашем случае надо принудительное приведение всех аргументов к типу string. Хотя, оригинальный Print этого не требует.
А я хочу, чтобы именно без изменения аргументов. Просто изменение имени функции.

 
Andrei Trukhanovich #:

так шаблоны же эту работу за вас сделают, так что 64 варианта. Возможно что-то типа есть в библиотеках у fxsaber, посмотрите

fxsaber - это что? Или кто?
 
void OnStart()
    {
     test();
//---
    }
//+------------------------------------------------------------------+
template<typename T>
void _Print(const T sString1)
{
   Print(sString1);
}
template<typename T, typename T1>
void _Print(const T sString1, 
            const T1 sString2)
{
   Print(sString1, sString2);
}
template<typename T, typename T1, typename T2>
void _Print(const T sString1, 
            const T1 sString2,
            const T2 sString3)
{
   Print(sString1, sString2, sString3);
}

void test()
{
   int x = 5;
   _Print("xxx");
   _Print("xxx ", x);
   _Print(x, " xxx ", true);
   _Print(x, " xxx ", 0.125);
}

Приравнивание не работает. Если только так решите свою задачу. Иначе принудительное приведение к string.

 
SimpleUser #:

Я не пишу "фичу" - это чисто моя "хотелка". Локальная.
И, кстати, подобные вещи как раз и помогают в тех же логах. Или в выводе текста из консоли в файл..
Если вам это не интересно/не нужно, то не нужно считать, что не нужно никому. Здесь не ЛОР, вроде. :)

на ЛОРе бы тебя съели :-)

class TeleType {
public:
   // надо передать кол-во аргументов, потому как признак "конца" лень имплементировать
   TeleType(int _nargs) { nargs=_nargs; result = "";}
   ~TeleType() { if (nargs==0 && result!="") Print(result); }
   TeleType(const TeleType &orig) {
      result=orig.result;
      nargs=orig.nargs-1;
   }
   TeleType operator&&(double x) { Push(DoubleToString(x)); return this;}
   TeleType operator&&(long x) { Push(IntegerToString(x));  return this;}
   TeleType operator&&(string x) { Push("\""+x+"\"");  return this;}
   void Push(string s) {
      if (result!="") result=result+" ";
      result=result + s;
   }
public:
   int nargs;
   string result;   
};

TeleType TT(int n) {
   return TeleType(n);
}
void OnStart()
{
   PrintFormat("TT start");
   TT(3) && 11 && 54.35 && "ПРИВЕТ"; 
   PrintFormat("TT final");
}

сколько можно аргументов ? сколько дашь в параметре, столько и будет.

каких типов ? любых для которых есть оператор &&

просто набросок, по желанию можно развивать в любую кось

 

F(x1) 

F(x1,x2) 

F(x1,x2,x3) 

Никому ни о чём не говорит? 

 
Maxim Kuznetsov #
каких типов ? любых для которых есть оператор &&

Где вы в Print амперсанды увидели? Нет их там. И не было.
Делать статический класс ради создания обёртки над функцией - это сильно! :) Впрочем, если никто толковых советов не даст - придётся делать что-то подобное..
Эх, посмотреть бы, как сами разработчики реализовали Print.