当我有一个接收(智能)指针并应该引用某些东西的函数时,我总是按照以下方式开始:
class Foo;
void doSomething(const std::shared_ptr<Foo>& pFoo)
{
assert(pFoo);
// ...
}
现在我正在寻找一个类似的断言条件,用于指向(智能)指针的向量(或其他容器)。我能想到的最好方法是:
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; }));
// ...
}
我想知道是否可以改进这个代码,是否可以避免使用lambda表达式?(我试过使用shared_ptr的get()方法,但是模板推导失败了)或者有其他办法来断言整个容器吗?
Foo&
作为参数的原因是什么?毕竟,这会_保证_存在一个对象而且无需使用 assert。同样的,向量中也可能包含std::reference_wrapper<Foo>
。 - paddyassert(!std::count(v.begin(), v.end(), nullptr));
- Piotr Skotnicki