Remember that the right way to pass char character classification functions (along with toupper and tolower ) that came from the C standard library is to convert it to unsigned char , and then to int .
Using std::ref and a reference_wrapper for this is easy and wrong. Using std::function<bool(int)> or std::function<bool(char)> more difficult as well as incorrect. In all these cases, the char in the string is directly converted to int , which is not suitable for this.
If you insist on not using lambda, then
std::find_if(s.begin(), s.end(), std::not1(std::function<bool(unsigned char)>(::ispunct)));
is one right way to do this. Otherwise
std::find_if(s.begin(), s.end(), [](unsigned char c) { return !ispunct(c); });
easier to understand - and shorter.
source share