函数返回其参数或检查nullptr

Ada*_*adi 3 c++ c++11 c++14 c++17

我想循环一个向量并过滤掉所有非空指针元素.我正在寻找一个std检查nullptr的std函数或一个实际返回传递给它的函数的函数(比如std::forward),因为空指针会求值false.

std::copy_if(dynamicObjects.begin(), dynamicObjects.end(),
    std::back_inserter(existingObjects), 
    std::is_pointer<ObjectType*>); // This does not compile

std::copy_if(dynamicObjects.begin(), dynamicObjects.end(),
    std::back_inserter(existingObjects), 
    std::forward<ObjectType*>); // This does not compile either

std::copy_if(dynamicObjects.begin(), dynamicObjects.end(),
    std::back_inserter(existingObjects), 
    static_cast<bool>); // This won't help me :)

std::copy_if(dynamicObjects.begin(), dynamicObjects.end(),
    std::back_inserter(existingObjects), 
    [] (const auto a) { return a; } ); // This is awkward
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 5

与东西卡住std,您可以使用std::remove_copy_ifstd::logical_not.

std::remove_copy_if(dynamicObjects.begin(), dynamicObjects.end(),
    std::back_inserter(existingObjects), 
    std::logical_not<ObjectType*>()); // or std::logical_not<> in C++14
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用remove_copy传递nullptr:

std::remove_copy(dynamicObjects.begin(), dynamicObjects.end(),
    std::back_inserter(existingObjects), 
    nullptr);
Run Code Online (Sandbox Code Playgroud)

如果你真的很喜欢copy_if,你可以使用not_fnnot1logical_not替代.