是否有可用作谓词的 std:: 函数(类似于 std::is_null_ptr)?

Vro*_*del 1 c++ null-pointer

我本来希望有一个简短、简洁、优雅的:

std::array<int*,10> ip_arr;
bool all_null = std::all_of(ip_arr.begin(),ip_arr.end(),std::is_null_ptr_as_fn);
Run Code Online (Sandbox Code Playgroud)

而不是为此目的发明 lambda:

std::array<int*,10> ip_arr;
bool all_null = std::all_of(ip_arr.begin(),ip_arr.end(),[](int *ip){ return ip == nullptr;});
Run Code Online (Sandbox Code Playgroud)

这甚至可能是可疑的,因为我忽略了它std::is_null_ptr,它应该读成这样:

std::array<int*,10> ip_arr;
bool all_null = std::all_of(ip_arr.begin(),ip_arr.end(),[](int *ip){ std::is_null_ptr r(ip); return r();});
Run Code Online (Sandbox Code Playgroud)

恶心。

Pet*_*etr 6

您可以std::indentity从 C++20 开始使用。由于指针可以隐式转换为 bool,

std::all_of(ip_arr.begin(), ip_arr.end(), std::identity());
Run Code Online (Sandbox Code Playgroud)

将测试所有指针是否不为nullptr。

要测试所有指针是否为空(正如您所要求的),您可以使用any_of并否定结果:

not std::any_of(ip_arr.begin(), ip_arr.end(), std::identity());
Run Code Online (Sandbox Code Playgroud)

反转std::indentity结果:

std::all_of(ip_arr.begin(), ip_arr.end(), std::not_fn(std::identity()));
Run Code Online (Sandbox Code Playgroud)

尽管使用 lambda 的代码可能更具可读性并且更容易理解。