Итак, у меня есть 2 функции с одинаковыми аргументами.
void example(int a, int b, ...);
void exampleB(int b, ...);
Теперь example
вызывает exampleB
, но как я могу передать переменные в списке аргументов переменных без изменения exampleB
(поскольку это уже используется в другом месте).
c++
variadic-functions
Недоступно
источник
источник
Ответы:
Вы не можете сделать это напрямую; вам нужно создать функцию, которая принимает
va_list
:источник
, ...
в подписи. Если вы преобразовали аргументы переменных в ava_list
, вы можете передатьva_list
их другой функции, которая принимает только ava_list
, но эта функция (или та, которую она вызывает) должна каким-то образом знать, что находится вva_list
.Может быть, бросить здесь камень в пруд, но, похоже, это неплохо работает с вариативными шаблонами C ++ 11:
По крайней мере, с ним работает
g++
.источник
args...
вы должны создать версии этих функций, которые принимают va_list, и передавать их. Взгляните на
vprintf
пример:источник
Я также хотел обернуть printf и нашел здесь полезный ответ:
Как передать переменное количество аргументов в printf / sprintf
Меня совершенно не интересовала производительность (я уверен, что этот фрагмент кода можно улучшить несколькими способами, не стесняйтесь делать это :)), это только для общей отладочной печати, поэтому я сделал следующее:
который я затем могу использовать вот так
С ++ ostreams красивы в некоторых аспектах, но на практике они становятся ужасными, если вы хотите напечатать что-то подобное с небольшими строками, такими как круглые скобки, двоеточия и запятые, вставленные между числами.
источник
Между прочим, многие реализации C имеют внутреннюю вариацию v? Printf, которая, IMHO, должна была быть частью стандарта C. Точные детали различаются, но типичная реализация будет принимать структуру, содержащую указатель на функцию вывода символов и информацию о том, что должно произойти. Это позволяет printf, sprintf и fprintf использовать один и тот же «основной» механизм. Например, vsprintf может выглядеть примерно так:
Затем функция core_printf вызывает p_inf-> func для каждого выводимого символа; функция вывода может затем отправить символы в консоль, в файл, строку или что-то еще. Если какая-либо реализация предоставляет функцию core_printf (и любой механизм настройки, который она использует), ее можно расширить всевозможными вариациями.
источник
Возможный способ - использовать #define:
источник
Основываясь на комментарии, который вы обертываете
vsprintf
и который помечен как C ++, я бы предложил не пытаться это сделать, а изменить свой интерфейс, чтобы вместо этого использовать iostreams C ++. У них есть преимущества передprint
рядом функций, такие как безопасность типов и возможность печатать элементы,printf
которые невозможно обработать. Некоторая переделка сейчас может сэкономить значительную часть боли в будущем.источник
Используя новый стандарт C ++ 0x, вы можете сделать это с помощью вариативных шаблонов или даже преобразовать этот старый код в новый синтаксис шаблона, ничего не нарушая.
источник
Это единственный способ сделать это ... и лучший способ сделать это тоже.
источник