如何在多个函数声明中重复使用相同的默认参数?
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;
在多个函数声明中重复使用相同值作为默认参数的惯用方法是什么?
用例
这出现在以下用例中:我有三个字符串 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;