Wpis z mikrobloga

Mam vector w którym są sharedpointery

std::vector<shared
ptr<Object>> tab;

i teraz chcę wyszukać obiekt po jednym z jego atrybutów

std::findif(tab.begin(), tab.end(), [](){});

To co chcę osiągnąć to:
std::find
if(tab.begin(), tab.end(), [](const Object& obj){return obj.atr == 3;});
Problem polega na tym, że najpierw musiałaby nastąpić dereferencja pointera. Da się to jakoś zrobić?
Czy lambda musi przyjmować const std::shared_prt<Object>& ?

#cpp
  • 3
@Gerax9: Lambda jest dla każdego elementu, więc dla std::shared_ptr<Object> i taki musi być argument.
Może wyglądać np. tak: [](const std::shared_ptr<Object> &ptr) {return ptr->atr == 3;}
@Gerax9: możesz stworzyć też stworzyć (generyczny) adapter, który będzie przyjmował funktor akceptujący T, a który będzie zwracał funktor akceptujący U, gdzie dereferencja U będzie dawać T. wtedy będzie można użyć tego mniej więcej tak

std::find_if(tab.begin(), tab.end(), withDeref([](const Object& obj){return obj.atr == 3;}));
przykładowy jednolinijkowy adapter w c++17(ofc można dorzucić tam perfect forwarding, ale to troche skomplikowane przy capture)

constexpr auto withDeref = [](auto& functor){return [functor](const auto& dereferencable){return functor(*dereferencable);};