Как повторно использовать один и тот же аргумент по умолчанию в нескольких объявлениях функций? - PullRequest
0 голосов
/ 20 апреля 2020

Как идиоматический c способ повторно использовать одно и то же значение в качестве аргумента по умолчанию в нескольких объявлениях функций?

Вариант использования

Это встречается в следующем случае использования: У меня есть три функции обрезки строк, которые либо принимают пользовательские функции, либо по умолчанию обрезают пробелы. Задание одного и того же лямбда-выражения 4 раза затрудняет чтение и обслуживание кода.

#include <cctype>
#include <functional>
#include <string>
[[nodiscard]] auto trim_left(std::string str,
                             std::function<bool(const char)> left = [](const char c){return !std::isspace(c);}) -> std::string;
[[nodiscard]] auto trim_right(std::string str,
                              std::function<bool(const char)> right = [](const char c){return !std::isspace(c);}) -> std::string;
[[nodiscard]] auto trim(std::string str,
                        std::function<bool(const char)> left = [](const char c){return !std::isspace(c);},
                        std::function<bool(const char)> right = [](const char c){return !std::isspace(c);}) -> std::string;

1 Ответ

0 голосов
/ 20 апреля 2020

Вы можете просто дать аргументу по умолчанию имя, например:

auto def = [](const char c){return !std::isspace(c);};

, а затем использовать его в качестве значения по умолчанию:

[[nodiscard]] auto trim_left(std::string str,
                             std::function<bool(const char)> left = def) -> std::string;
[[nodiscard]] auto trim_right(std::string str,
                              std::function<bool(const char)> right = def) -> std::string;
[[nodiscard]] auto trim(std::string str,
                        std::function<bool(const char)> left = def,
                        std::function<bool(const char)> right = def) -> std::string;

Вы можете назвать тип сигнатуры функции а также вот так:

using fun = std::function<bool(const char)>;

, и тогда функции еще проще читать:

[[nodiscard]] auto trim_left(std::string str, fun left = def) -> std::string;
[[nodiscard]] auto trim_right(std::string str, fun right = def) -> std::string;
[[nodiscard]] auto trim(std::string str, fun left = def, fun right = def) -> std::string;
...