std :: ptr_fun替换c ++ 17

时间:2017-07-07 14:34:11

标签: 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;
}

this answer中所示。

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

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

如何解决这个问题?

6 个答案:

答案 0 :(得分:24)

你使用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和lambdas存在之前。

答案 1 :(得分:14)

只需使用lambda:

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

请注意,我将参数类型更改为unsigned char,请参阅notes for std::isspace了解原因。

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

答案 2 :(得分:3)

根据cppreference,{C} 11以来std::ptr_fun已被弃用,自C ++ 17以来已停止使用。

同样,自C ++ 17以来,std::not1已被弃用。

所以最好不要使用,但要使用lambda(如其他答案中所述)。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我的回答类似于巴里的回答(https://stackoverflow.com/a/44973511/1016580)。

而不是

int isspace(int c);

来自标准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()); }

答案 5 :(得分:0)

您可以按照Nicol Bolas的建议使用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;
  }