Необязательный параметр записи для функции c ++ - PullRequest
0 голосов
/ 24 июня 2018

У меня есть функция с необязательным параметром, который можно использовать для сбора промежуточных выходных данных.

Например, допустим, я собираю частичные суммы при суммировании массива, например:

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, например:

  1. Я хочу, чтобы ветвь writeout была удалена компилятором, если writeout установленв false, поэтому мы не проверяем его и не разветвляем каждую итерацию внутреннего цикла.

  2. Я хочу избежать дублирования любой реализации (давайте представим, что реальная функция намного сложнеечем этот)

  3. Я хочу иметь возможность использовать обе версии функции в другом месте моего кода (не могу сделать это с вещами типа #DEFINE).

Если я воспользуюсь приведенным выше примером, мне все равно придется предоставить «фиктивный» указатель на место вызова, например:

auto result = sumNumbers<false>(numbers, NULL)

, что не совсем приемлемо.Как это решить?

1 Ответ

0 голосов
/ 24 июня 2018

Вы можете использовать значения параметров по умолчанию как для параметра шаблона, так и для параметра функции, например:

template<bool writeout = false>
double sumNumbers(const std::vector<double> &numbers, double *out_partialsums = NULL) {
    ...
}

, и звонок будет либо с дополнительной суммой:

auto result = sumNumbers<true>(numbers, subsum);

или без него:

auto result = sumNumbers(numbers);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...