У меня есть функция, которая обрабатывает данный вектор, но может также создать такой вектор, если он не задан.
Я вижу два варианта дизайна для такого случая, когда параметр функции является необязательным:
Сделайте это указателем и сделайте его NULL
по умолчанию:
void foo(int i, std::vector<int>* optional = NULL) {
if(optional == NULL){
optional = new std::vector<int>();
// fill vector with data
}
// process vector
}
Или имеют две функции с перегруженным именем, один из которых не учитывает аргумент:
void foo(int i) {
std::vector<int> vec;
// fill vec with data
foo(i, vec);
}
void foo(int i, const std::vector<int>& optional) {
// process vector
}
Есть ли причины предпочесть одно решение над другим?
Я немного предпочитаю второй, потому что я могу сделать ссылку a const
вектором, так как она при условии, только читается, не записывается. Кроме того, интерфейс выглядит более чистым (не NULL
просто взломать?). И разница в производительности, вызванная вызовом косвенных функций, вероятно, оптимизирована.
Тем не менее, я часто вижу первое решение в коде. Есть ли веские причины, чтобы предпочесть его, кроме лжи программиста?