std :: ptr_fun替换c ++ 17

use*_*478 18 c++ c++17

我使用std::ptr_fun如下:

static inline std::string &ltrim(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;
}
Run Code Online (Sandbox Code Playgroud)

本回答所示.

但是这不能用C++ 17编译(使用Microsoft Visual Studio 2017),错误如下:

error C2039: 'ptr_fun': is not a member of 'std'
Run Code Online (Sandbox Code Playgroud)

怎么解决这个问题?

Nic*_*las 35

你使用lambda:

static inline std::string &ltrim(std::string &s) {
    s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int c) {return !std::isspace(c);}));
    return s;
}
Run Code Online (Sandbox Code Playgroud)

你引用的答案是从2008年开始,早在C++ 11和lambdas存在之前.

  • @TC 我不明白 - `std::isspace()` 需要一个 `int`。如果转换为`int` 发生在`isspace()` 或另一个只调用`isspace()` 的函数中,这有什么区别? (2认同)
  • @Barry关键是你不应该用`char`或`char`转换(直接)到`int`来调用任何C字符分类函数.你应该用`char`转换为`unsigned char`然后转换为`int`来调用它们.中间的`unsigned char`转换是正确处理负值`char`s所必需的. (2认同)
  • @TC那只是一个可怕的界面.耶 (2认同)

Bar*_*rry 16

只需使用lambda:

[](unsigned char c){ return !std::isspace(c); }
Run Code Online (Sandbox Code Playgroud)

请注意,我将参数类型更改为unsigned char,请参阅说明std::isspace原因.

std::ptr_fun 在C++ 11中已弃用,并将在C++ 17中完全删除.


Wal*_*ter 5

根据cppreferencestd::ptr_fun自 C++11 起已弃用,自 C++17 起已停止使用。

同样,std::not1自 C++17 起已弃用。

所以最好不要使用任何一个,而是使用 lambda (如其他答案中所解释的)。