Когда у меня есть функция, получающее (смарт) указатель, который должен передать что-то, я всегда начинаю следующим образом:C++, как утверждать, что все станд :: shared_ptr в векторе, ссылаясь на то
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; }));
// ...
}
Интересно, может ли это быть улучшено. Можно ли избежать лямбда? (Я попытался использовать метод get() для shared_ptr, но вычет шаблона не удался) Или существует другой способ для утверждения для всего контейнера?
Есть ли причина, почему вы не измените вашу функцию синтаксис для получения «Foo &» вместо? В конце концов, это _guarantees_ есть объект и не требуется утверждение. Аналогично вектору, который может содержать 'std :: reference_wrapper'. –
paddy
'assert (! Std :: count (v.begin(), v.end(), nullptr));' –
@PiotrSkotnicki Это посещает все элементы, тогда как мы можем вырваться, когда первый, который не удовлетворяет условие найдено. – juanchopanza