Std:: ptr_fun для С++ 17
Я использую std::ptr_fun
следующим образом:
static inline std::string <rim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
return s;
}
как представлено в этом ответе.
Однако это не скомпилировано с С++ 17 (с использованием Microsoft Visual Studio 2017) с ошибкой:
error C2039: 'ptr_fun': is not a member of 'std'
Как это можно зафиксировать?
Ответы
Ответ 1
Вы используете лямбда:
static inline std::string <rim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int c) {return !std::isspace(c);});
return s;
}
Ответ, который вы указали, относится к 2008 году, задолго до того, как существовали С++ 11 и lambdas.
Ответ 2
Просто используйте лямбда:
[](unsigned char c){ return !std::isspace(c); }
Обратите внимание, что я изменил тип аргумента на unsigned char
, см. примечания для std::isspace
для чего.
std::ptr_fun
был устарел в С++ 11 и полностью удаляется в С++ 17.
Ответ 3
В качестве альтернативы вы можете использовать std:: not_fn:
static inline std::string <rim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(),
std::not_fn(static_cast<int(*)(int)>(std::isspace))));
return s;
}
Ответ 4
Согласно cppreference, std::ptr_fun
устарел с С++ 11 и прекратил работу с С++ 17.
Аналогично, std::not1
устарел с С++ 17.
Так что лучше всего не использовать, но лямбда (как объяснялось в других ответах).