Вы можете просто дать аргументу по умолчанию имя, например:
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;