Как избавиться от лишних аргументов
От: PlusMyTwitterFace  
Дата: 25.09.12 03:44
Оценка:
Можно ли каким-то образом "избавиться" от "лишних" аргументов функции?

Например, есть у меня, допустим, функция со следующим объявлением:

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-версии для каждого типа, используемого в программе — это какой-то ужас.

Передаваться нули тоже не вариант — никто не гарантирует, что внутри этих функций будут сделаны соответствующие проверки.

Что посоветуете сделать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.