谁能解释这段代码?我不明白 not1() 和 ptr_fun() 的工作原理

Can anyone explain this code? I do not understand the working of not1() and ptr_fun()

谁能解释一下这个函数的工作原理?

string rightTrim(const string &str)
{
    string s(str);
    s.erase(find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(), s.end());
    return s;
}

我不知道 not1()ptr_fun() 的工作原理。任何人都可以为我提供这段代码的良好解释吗?

PS:我知道,这段代码删除了字符串末尾的所有空格。

问题本质上是

What is not1(ptr_fun<int, int>(isspace))?

简答

您应该改用 std::not_fn(isspace),它清楚地表明它是表达“某物不是 space”的想法的“事物”。(¹)(²)

冗长的回答

这是一个谓词,它询问它的输入是否是 not a space:如果你将它应用到 'a' 你会得到 true ,如果你将它应用到 ' ',你会得到 false.

然而,上面一段中的 not 解释了为什么代码有 not1 的原因,但它没有说明 ptr_fun . that 有什么用?为什么我们不能只写 not1(isspace)

长话短说,not1 is an old generation helper function which was deprecated in C++17 and removed in C++20。它依赖于你传递给它的参数来获得一个名为 argument_type 的成员类型,但是 isspace 是一个自由函数,而不是提供这样一个成员的 class 的对象,所以 not1(isspace)格式错误。

ptr_fun 来拯救,因为它可以在提供 not1 期望的接口的对象中转换 isspace

然而,ptr_fun was deprecated even before not1, in C++11, and removed in C++17.

因此,底线是您不应该使用其中任何一个:您不再需要 ptr_fun,并且您可以使用 not_fn 作为 [=17= 的更有用的替代方案].您确实可以将 not1(ptr_fun<int, int>(isspace)) 更改为 std::not_fn(isspace),这也更像是 " is not a space".


(¹) 顺便打住using namespace std;It's just the wrong thing to do.

(²) 是的,即使你必须坚持使用 C++14,也不要使用 std::not1。在 C++14 中你已经有了通用的 lambda,所以你可以自己定义一个准 not_fn (working example):

auto not_fn = [](auto const& pred){
    return [&pred](auto const& x){
        return !pred(x);
    };
};