我使用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;
}
如this answer中所示。
但是,这无法使用C++17编译(使用Microsoft Visual Studio 2017),并显示错误:
error C2039: 'ptr_fun': is not a member of 'std'
如何解决这个问题?
7条答案
按热度按时间hlswsv351#
您可以使用lambda:
你引用的答案来自2008年,远在C++11和lambda存在之前。
xzlaal3s2#
只需使用lambda:
请注意,我将参数类型更改为
unsigned char
,有关原因,请参见std::isspace
的注解。std::ptr_fun
在C11中已被弃用,并将在C17中完全删除。roqulrg33#
根据cppreference,
std::ptr_fun
自C11起被弃用,自C17起停止使用。类似地,
std::not1
自C++17起被弃用。所以最好两者都不要使用,而是使用lambda(如其他答案中所解释的)。
cig3rfwq4#
我的答案与本帖中已经给出的答案相似。但不是
函数,我建议使用
标准
C++
库(http://en.cppreference.com/w/cpp/locale/isspace)中的函数示例化,它的类型更加正确。在这种情况下,您不需要考虑char -> unsigned char -> int
转换和当前用户的区域设置。搜索非空格的lambda将如下所示:
ltrim
函数的完整代码如下所示:nwwlzxa75#
或者,您可以使用std::not_fn:
ibps3vxo6#
你可以使用尼可波拉斯建议的Lambda,但你也可以使用auto,类型将在那里被推导出来,如下所示:-
p8ekf7hl7#
使用具有λ
std::isspace
代替std::ptr_fun
,您可以找到有关std::isspace的更多详细信息