Kiedy mam funkcję odbiera (Smart) wskaźnik, który ma odnosić się coś, zawsze zaczynają się następująco:C++ jak twierdzić, że wszystko std :: shared_ptr w wektorze odnosimy się do czegoś
class Foo;
void doSomething(const std::shared_ptr<Foo>& pFoo)
{
assert(pFoo);
// ...
}
Teraz szukam podobnego warunku asertywnego dla wektora (lub innego pojemnika) wskaźników (inteligentnych). Najlepsze co mogę wymyślić to:
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; }));
// ...
}
Zastanawiam się, czy można to poprawić. Czy można uniknąć lambda? (Próbowałem użyć metody get() shared_ptr, ale odliczanie szablonów nie powiedzie się). Czy istnieje inny sposób potwierdzenia całego kontenera?
Czy jest jakiś powód, dla którego nie zmieni swoją funkcję na Składnia do otrzymania 'Foo &' zamiast? Wszakże to _warunki_ są obiektem i nie wymaga się dowodu. Podobnie jest z wektorem, który może zawierać 'std :: reference_wrapper'. –
paddy
'assert (! Std :: count (v.begin(), v.end(), nullptr));' –
@PiotrSkotnicki Który odwiedza wszystkie elementy, podczas gdy możemy wyjść, gdy pierwszy, który nie spełnia znaleziono warunek. – juanchopanza