c ++如何断言向量中的所有std :: shared_ptr都指的是某些东西

mr_*_*r_T 6 c++ assert vector shared-ptr c++11

当我有一个函数接收一个应该引用某个东西的(智能)指针时,我总是按如下方式开始:

class Foo;
void doSomething(const std::shared_ptr<Foo>& pFoo)
{
    assert(pFoo);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在我正在为(智能)指针的向量(或其他容器)寻找类似的断言条件.我能想到的最好的是:

void doSomething(const std::vector<std::shared_ptr<Foo> >& pFoos)
{
    assert(std::all_of(pFoos.begin(), pFoos.end(), [](const std::shared_ptr<Foo>& pFoo) { return pFoo; }));
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我想知道这是否可以改善..可以避免lambda吗?(我尝试使用shared_ptr的get()方法,但模板推导失败)或者是否有另一种断言整个容器的方法?

San*_*dro 10

还有一种方法:

assert(std::find(pFoos.begin(), pFoos.end(), nullptr) == pFoos.end());
Run Code Online (Sandbox Code Playgroud)


Que*_*tin 9

使用标准功能表达它的另一种稍微复杂的方式:

assert(std::none_of(pFoos.begin(), pFoos.end(), std::logical_not<std::shared_ptr<Foo>>{}));
Run Code Online (Sandbox Code Playgroud)

从C++ 14开始,您可以使用以下通用专业化std::logical_not:

assert(std::none_of(pFoos.begin(), pFoos.end(), std::logical_not<>{}));
Run Code Online (Sandbox Code Playgroud)