使其更通用
代码中的任何内容都不依赖于字符串
成为标准::字符串
。它适用于任何具有擦除()
成员函数和支持的元素类型标准::isspace()
.
如果不修改字符串
而不是像托比建议的那样返回修剪子范围的视图,它将适用于更多类型。
虽然修剪空白通常是您想要的,但也有一些情况下,您希望修剪掉其他字符。所以即使对于标准::字符串
s、 可以传入一个函数作为标准::isspace()
这样,它就可以在更多的容器上工作。
更通用的修剪功能可能如下所示:
模板<std::范围::input_range R,标准::indirect_unary_predicateconstexpr标准::范围::borrowed_subrange_t修剪(R&&R,Pred-Pred){自动开始=标准::范围::findif_not(r,pred);auto-end=标准::范围::find_if_not(r |标准::视图::reverse,pred).base();返回{begin,end};}
唯一的缺点是,如果你给它一个字符串类型作为输入,你会得到一个字符串或字符串类型。使用上述代码,您必须编写如下内容:
标准::字符串消息{“2小时\n 65。\n“};自动修剪子范围{修剪(消息)};标准::string_view trimmed_str(trimmed_subrange.begin(),trimmed-subrange.end());标准::cout<<trimmed_str<<'\n';
因此,自动为您进行专门化会很好。
请注意,如果范围中的所有元素都与谓词匹配,那么上面的代码就有一个错误,修复这个问题留给读者练习。