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

 
Доброго времени суток!
Известно, что в функцию Print можно передать любое число аргументов (до 64) в произвольном порядке.
Т.е. например
int a = 1;
double b = 2.34;
string c = "текст";
Print(a, b, c);
Print(b, c, a);
Print(c, a, b);
Да, это не красиво, но работает.
Как можно реализовать подобную функцию?
 

Сделать аргументы функции со значениями по умолчанию:

void MyFunction(string sString1, string sString2 = NULL, ..., string sString64 = NULL);
 
Если бы так всё просто было. А со всякими "implicit conversion from 'number' to 'string'" что делать? Должно быть более изящное решение.
 
SimpleUser #:
Если бы так всё просто было. А со всякими "implicit conversion from 'number' to 'string'" что делать? Должно быть более изящное решение.

Шаблон:

template<typename T1, typename T2 = string, ..., typename T64 = string>
void MyFunction(T1 sString1, T2 sString2 = NULL, ..., T64 sString64 = NULL);
 
Не работает. Или я что-то не так делаю
template<typename T1,
         typename T2,
         typename T3>
void f_Print(T1 sString1, 
             T2 sString2 = NULL,
             T3 sString3 = NULL)
{
   Print(sString1, sString2, sString3);
}

void test()
{
   int x = 5;
   f_Print("xxx", x);
   f_Print(x, "xxx");
}
Ошибка: 'f_Print' - cannot to apply template"
 
я бы наверное собирал бы одну строку в принт Print(total), а string total = a+b+c; - вот и произвольное число элементов и порядок, а пропуски можно приплюсовывать " "
 
Aleksey Semenov #:
я бы наверное собирал бы одну строку в принт Print(total), а string total = a+b+c; - вот и произвольное число элементов и порядок, а пропуски можно приплюсовывать " "
Вы бы лучше кодом пояснили. Или псевдокодом, если не умеете программировать.
А так, непонятно, что вы хотели сказать.
Повторю задачу: фактически мне нужна функция, подобная Print. Если бы MT5 был в исходниках, я просто посмотрел бы реализацию этой функции и всё (или хотя бы заголовочный файл), а тут увы, приходится угадывать, как именно она реализована.
 
SimpleUser #:
Не работает. Или я что-то не так делаю
Ошибка: 'f_Print' - cannot to apply template"
void f_Print(T1 sString1, 
             T2 sString2 = NULL,
             T3 sString3 = NULL)
{
   Print(sString1, sString2 == NULL ? "" : sString2, sString3 == NULL ? "" : sString3);
}

Не проверял но по идеи должно работать.

 
Konstantin Nikitin #:

Не проверял но по идеи должно работать.

Можно даже закомментировать вызов Print - ошибка будет та же. Шаблон хочет строго 3 аргумента, в моём случае.

 
SimpleUser #:

Можно даже закомментировать вызов Print - ошибка будет та же. Шаблон хочет строго 3 аргумента, в моём случае.

Ну киньте пустое значение и пусть радуется.

void test()
{
   int x = 5;
   f_Print("xxx", x, "");
   f_Print(x, "xxx", "");
}
 
Konstantin Nikitin #:

Ну киньте пустое значение и пусть радуется.

Угу. А если аргументов будет 64, то код получится очень красивым, правда? :) В самой функции Print эту проблему ведь обошли, без "киньте пустое значение".
Это не решение, совсем.
Причина обращения: