目前,如果要否定谓词,则必须使用std ::<
algorithm> _if_not变体或lambda.但是为了学术,我想知道这是否可行:
std::string s("hello"); std::find_if(s.begin(),s.end(),std::not1(::ispunct));
解决方法
请记住,将字符传递给来自C标准库的字符分类函数(以及toupper和tolower)的正确方法是首先将其转换为unsigned char,然后再转换为int.
使用std :: ref和reference_wrapper是轻量级的,也是错误的.使用std :: function< bool(int)>或者std :: function< bool(char)>更重量级,也是错误的.在所有这些情况下,字符串中的char直接转换为int,这不是正确的方法.
如果你坚持不使用lambda,那么
std::find_if(s.begin(),std::not1(std::function<bool(unsigned char)>(::ispunct)));
是一种正确的方法.除此以外
std::find_if(s.begin(),[](unsigned char c) { return !ispunct(c); });
更容易理解 – 更短.