我本来希望有一个简短、简洁、优雅的:
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)
恶心。
您可以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 的代码可能更具可读性并且更容易理解。