如何在多个函数声明中重复使用相同的默认参数?

How to re-use the same default argument in multiple function declarations?

在多个函数声明中重复使用相同值作为默认参数的惯用方法是什么?

用例

这出现在以下用例中:我有三个字符串 trim 函数,它们默认采用自定义函数或 trim 空格。指定相同的 lambda 表达式 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;

您可以只为默认参数命名,如下所示:

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;