Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / variadic function / 10 сообщений из 10, страница 1 из 1
03.05.2017, 13:31
    #39447828
Q
Q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
Здравствуйте,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
void foo1(char *format, ...)
{
   va_list args;
   va_start(args, format);
   char buffer[512];
   vsprintf(buffer, format, args); //мусор
   va_end(args);
}

void foo2(char *format, ...)
{
   va_list args;
   va_start(args, format);
   foo1(format, args);
   va_end(args);
}

int main()
{
   foo2("%s %d", "test", 1);
   return 0;
}



Как правильно перенапрвить вариативные аргументы в другую функцию?
...
Рейтинг: 0 / 0
03.05.2017, 13:48
    #39447843
Q
Q
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
Разобрался,
Надо создавать функцию, которая принимает параметр va_list, но так-как это функция не моя, то значит никак.
...
Рейтинг: 0 / 0
03.05.2017, 14:14
    #39447864
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
Технически, можно на ассемблере подправить стек
...
Рейтинг: 0 / 0
03.05.2017, 14:17
    #39447865
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
Можно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void foo2(char *format, ...)
{
   va_list args;
   va_start(args, format);
   char buffer[512];
   vsprintf(buffer, format, args); 
   va_end(args);
   foo1(buffer);
}
...
Рейтинг: 0 / 0
03.05.2017, 14:42
    #39447893
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
Q,

можете ли вы использовать C++11? Если да, то http://en.cppreference.com/w/cpp/language/parameter_pack

Код: plaintext
1.
2.
3.
4.
5.
template<class ...Args>
void foo2(Args... args)
{
    foo1(args...);
}
...
Рейтинг: 0 / 0
03.05.2017, 14:46
    #39447898
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
ermak.nn,

Забыл std::forward
...
Рейтинг: 0 / 0
04.05.2017, 15:33
    #39448800
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
NekZermak.nn,

Забыл std::forward

По-моему, не забыл (хотя могу ошибаться). Насколько я помню forward нужен для perfect forwarding ( http://en.cppreference.com/w/cpp/utility/forward). В случае variadic templates он не нужен.
...
Рейтинг: 0 / 0
04.05.2017, 18:17
    #39448941
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
QРазобрался,
Надо создавать функцию, которая принимает параметр va_list, но так-как это функция не моя, то значит никак.

вообще обычно такие функции делаться парами, одна с элипсисом, другая - реализация - с va_list.
Посмотри, может и у тебя так же.
...
Рейтинг: 0 / 0
07.05.2017, 16:51
    #39449933
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
ermak.nnВ случае variadic templates он не нужен.как раз именно в этом случаи и нужен forward. он позволяет передать агрументы следующей функции оставив их такими, какими они пршли. без него rvalue ссылка станет lvalue. таким образом без forward может быть вызвана не та перегрузка.
...
Рейтинг: 0 / 0
10.05.2017, 11:26
    #39450654
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
variadic function
alexy_blackermak.nnВ случае variadic templates он не нужен.как раз именно в этом случаи и нужен forward. он позволяет передать агрументы следующей функции оставив их такими, какими они пршли. без него rvalue ссылка станет lvalue. таким образом без forward может быть вызвана не та перегрузка.
Да, виноват, разобрался. Всё именно так, как вы описали.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / variadic function / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]