powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / variadic function
10 сообщений из 10, страница 1 из 1
variadic function
    #39447828
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Здравствуйте,
Код: 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
variadic function
    #39447843
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Разобрался,
Надо создавать функцию, которая принимает параметр va_list, но так-как это функция не моя, то значит никак.
...
Рейтинг: 0 / 0
variadic function
    #39447864
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Технически, можно на ассемблере подправить стек
...
Рейтинг: 0 / 0
variadic function
    #39447865
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так
Код: 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
variadic function
    #39447893
ermak.nn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
variadic function
    #39447898
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ermak.nn,

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

Забыл std::forward

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

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


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