用于c++17的std::ptr_fun替换

v09wglhw  于 2022-11-27  发布在  其他
关注(0)|答案(7)|浏览(389)

我使用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;
}

this answer中所示。
但是,这无法使用C++17编译(使用Microsoft Visual Studio 2017),并显示错误:

error C2039: 'ptr_fun': is not a member of 'std'

如何解决这个问题?

hlswsv35

hlswsv351#

您可以使用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;
}

你引用的答案来自2008年,远在C++11和lambda存在之前。

xzlaal3s

xzlaal3s2#

只需使用lambda:

[](unsigned char c){ return !std::isspace(c); }

请注意,我将参数类型更改为unsigned char,有关原因,请参见std::isspace的注解。
std::ptr_fun在C11中已被弃用,并将在C17中完全删除。

roqulrg3

roqulrg33#

根据cppreferencestd::ptr_fun自C11起被弃用,自C17起停止使用。
类似地,std::not1自C++17起被弃用。
所以最好两者都不要使用,而是使用lambda(如其他答案中所解释的)。

cig3rfwq

cig3rfwq4#

我的答案与本帖中已经给出的答案相似。但不是

int isspace(int c);

函数,我建议使用

bool isspace(char c, const locale& loc);

标准C++库(http://en.cppreference.com/w/cpp/locale/isspace)中的函数示例化,它的类型更加正确。在这种情况下,您不需要考虑char -> unsigned char -> int转换和当前用户的区域设置。
搜索非空格的lambda将如下所示:

[](char c) { return !std::isspace(c, std::locale::classic()); }

ltrim函数的完整代码如下所示:

static inline std::string& ltrim(std::string& s) {
    auto is_not_space = [](char c) { return !std::isspace(c, std::locale::classic()); };
    auto first_non_space = std::find_if(s.begin(), s.end(), is_not_space);
    s.erase(s.begin(), first_non_space);
    return s;
}
nwwlzxa7

nwwlzxa75#

或者,您可以使用std::not_fn

static inline std::string &ltrim(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;
}
ibps3vxo

ibps3vxo6#

你可以使用尼可波拉斯建议的Lambda,但你也可以使用auto,类型将在那里被推导出来,如下所示:-

static inline std::string &ltrim(std::string &s) {
    s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](auto c) {return 
       !std::isspace(c);}));
    return s;
  }
p8ekf7hl

p8ekf7hl7#

使用具有λ std::isspace代替std::ptr_fun

static inline std::string &ltrim(std::string &s) {
    str.erase(str.begin(), std::find_if(str.begin(), str.end(),
    [](unsigned char c) { return !std::isspace(c);}));
    return s;
}

您可以找到有关std::isspace的更多详细信息

相关问题