Можно ли каким-то образом "избавиться" от "лишних" аргументов функции?
Например, есть у меня, допустим, функция со следующим объявлением:
void foo(std::size_t* _1, float* _2, double* _3, int* _4);
При её вызове в некоторых местах мне не нужно передавать ей _1, _2 и _3 для заполнения, лишь _4. Однако из-за того, что в качестве параметров используются указатели, мне всё равно приходится создавать дополнительные переменные:
std::size_t _1;
float _2;
double _3;
int _4; // Единственная важная для нас переменная в данном случае
foo(&_1, &_2, &_3, &_4);
Вызывать такие функции приходится довольно много раз, в связи с чем создание лишних переменных каждый раз — не самая лучшая идея (увеличивается объём кода и визуально более сложно понять, какая из переменных нам на самом деле нужна).
В C99 и C11 эту проблему можно решить при помощи compound literals:
foo((std::size_t[]){0}, (float[]){0.0f}, (double[]){0.0}, &_4);
В C++ на ум приходит лишь два решения:
— Создать отдельную функцию foo_wrapper, которая будет создавать "лишние аргументы" на своей стороне, а в качестве аргумента принимать лишь действительно необходимый. Не самый лучший вариант, поскольку в разные моменты времени "необходимыми" бывают совершенно разные аргументы. Более того, таких функций достаточно много, и писать для каждой из них такие врапперы не самая лучшая идея.
— Создать в file_scope переменные всех фундаментальных типов с приставкой "dummy", которые, собственно, и будут использоваться для передачи в такие функции. Также не самый лучший вариант — лишнее засорение глобального пространства имён. Кроме того, в подобные функции иногда передаются даже User-defined types, а писать dummy-версии для каждого типа, используемого в программе — это какой-то ужас.
Передаваться нули тоже не вариант — никто не гарантирует, что внутри этих функций будут сделаны соответствующие проверки.
Что посоветуете сделать?