У меня есть функция с необязательным параметром, который можно использовать для сбора промежуточных выходных данных.
Например, допустим, я собираю частичные суммы при суммировании массива, например:
template<bool writeout> double sumNumbers(const std::vector<double> &numbers, double *out_partialsums) {
double total = 0.0;
for (int i = 0; i < numbers.size(); i++) {
total += numbers[i];
/* ... */
if (writeout) {
out_partialsums[i] = total;
}
}
return total;
}
(double *
используется здесь для аргументации)
Однако я хочу, чтобы он вызывался при полностью отключенном параметре writeout, например:
Я хочу, чтобы ветвь writeout была удалена компилятором, если writeout установленв false, поэтому мы не проверяем его и не разветвляем каждую итерацию внутреннего цикла.
Я хочу избежать дублирования любой реализации (давайте представим, что реальная функция намного сложнеечем этот)
Я хочу иметь возможность использовать обе версии функции в другом месте моего кода (не могу сделать это с вещами типа #DEFINE).
Если я воспользуюсь приведенным выше примером, мне все равно придется предоставить «фиктивный» указатель на место вызова, например:
auto result = sumNumbers<false>(numbers, NULL)
, что не совсем приемлемо.Как это решить?