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

 
void OnStart()
    {
     test();
//---
    }
//+------------------------------------------------------------------+
template<typename T1,
         typename T2,
         typename T3>
void Print(T1 sString1, 
             T2 sString2 = NULL,
             T3 sString3 = NULL)
{
   ::Print(sString1, sString2, sString3);
}

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

Вполне работает. Даже интересно в чем проблема вашего кода.

Хотя конечно не вариант. Смысл лишний костыль делать, если и напрямую можно сделать Print и все.

Чисто ради интереса решил написать данный вариант сейчас.

 

Может так:

template<typename T>

string ToString(T t)
   {
   if(typename(t)=="int") return(IntegerToString(t);
   if(typename(t)=="double") return(DoubleToString(t);
   return(string(t));
   }
   
Print(ToString(a),ToString(b),ToString(c),......);
 
Konstantin Nikitin #:
Вполне работает. Даже интересно в чем проблема вашего кода.

Не работает. Просто попробуйте назвать функцию f_Print, а потом уже из неё вызвать оригинальный Print.
Я просто не хочу переписывать оригинальную функцию, а просто хочу описать нужную мне функцию в моей библиотеке. Потом в своём советнике заменить Print на f_Print и всё. Чтобы при желании, я потом вернуть всё назад.

 
Aleksei Stepanenko #:

Может так:

Нет. Я хочу просто временно переименовать функцию Print в f_Print без добавления лишнего кода (вроде ToString). А потом, при необходимости, просто переименовать обратно.
Фактически, я хочу сделать обёртку над Print. В более современном C++ я бы просто использовал троеточие, а тут...

 
Ну ладно.
 
Konstantin Nikitin #:

Вполне работает. Даже интересно в чем проблема вашего кода.


Можете переписать ваш шаблон так

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

И увидеть, что "Test:" не выведется. Вы просто описали одноимённую функцию Print, но вызываете оригинальную.

 
SimpleUser #:

Можете переписать ваш шаблон так

И увидеть, что "Test:" не выведется. Вы просто описали одноимённую функцию Print, но вызываете оригинальную.

void OnStart()
    {
     test();
//---
    }
//+------------------------------------------------------------------+
void _Print(const string sString1, 
            const string sString2 = "",
            const string sString3 = "")
{
   Print(sString1, sString2, sString3);
}

void test()
{
   int x = 5;
   _Print("xxx");
   _Print("xxx ", (string)x);
   _Print((string)x, " xxx ", (string)12345);
}
Такой вариант работает. Похоже с шаблонами не получается просто.
 
Konstantin Nikitin #:
Такой вариант работает. Похоже с шаблонами не получается просто.

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

int x=1;
bool ok = f();
if(ok)
   Print("всё хорошо");
else
   Print("всё сломалось");
Print("X: ", x);

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

int x=1;
bool ok = f();
if(ok)
   f_Print("всё хорошо");
else
   f_Print("всё сломалось");
f_Print("X: ", x);

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

 

Фантазии это хорошо..Нет таких проблем какие мы не можем себе создать

---

А case где нужна/востребована "функция с переменным числом произвольных параметров" кто-нить представил ? примерное назначение и устройство этой функции ??

Единственный живой пример - вывод в журнал и тому подобное. Но для такого даже в C++ перегружают операторы << и считают за счастье (это при том что vararg там есть у них)

Можно и тут также сделать, вместо функции будет потоковый "комбайн" через << или редко используемый ~

программисту какая разница что писать Foo(a,b,c,d) или Foo()<<a<<b<<c<<d<<TheEnd() ?? 

второй вариант редко но удобнее - можно избежать временных переменных и пихать аргументы по мере готовности в несколько приёмов. И может быть расширен (ещё одной перегрузкой <<) без правки кода Foo()

и компилятору удобнее знать что типы конкретны. 

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

 
SimpleUser #:
В самой функции Print эту проблему ведь обошли, без "киньте пустое значение".

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

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