std::function<void(void)> f = [](){};
std::list<std::function<void(void)>> list;
list.push_back(f);
...
list.remove(как найти/удалить нужную лямбу по значению?)
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, Barbar1an, Вы писали:
B>list.remove(как найти/удалить нужную лямбу по значению?)
Как ты знаешь, которая лямбда — "нужная"?
Сами по себе лямбды — не EqualityComparable. (std::function — тоже, несмотря на то, что у них есть operator== — он не над ними, а с nullptr'ом).
Исключение — это когда лямбда не захватывает контекст и является просто анонимной функцией: функции можно сравнивать по указателям.
Так что способов два
— интрузивный — хранить в списке и лямбды, и некоторые их идентификаторы
— неинтрузивный — хранить итератор на элемент списка с "нужной" лямбдой, или иным способом отслеживать положение (порядковый номер и т.п.)
list.push_back(f);
B>...
B>list.remove(как найти/удалить нужную лямбу по значению?)
B>
Тупые варианты включают:
1. Вызвать всех подряд — заценить сайдэффекты от каждой.
2. pop_back() же
А по нормальному — запомнить итератор, сменить тип контейнера, написать класс-функтор и хранить некий id вместе с лямбдой, по которому можно сравнивать и т.п.
Здравствуйте, Vain, Вы писали:
V>Наверно стоит придумать какой-то идентификатор и хранить рядом как пару. Только зачем такое понадобилось вообще?
event<void()> e;
e += [](){};
а теперь не отпишешься
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, rg45, Вы писали:
R>Почему именно по значению, а не по итератору?
ну как почему? потому что интератор нельзя хранить ибо он инвалидируется как тока список изменяется
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, Barbar1an, Вы писали:
R>>Почему именно по значению, а не по итератору? B>ну как почему? потому что интератор нельзя хранить ибо он инвалидируется как тока список изменяется
итератор std::list инвалидируется только после удаления элемента, на который он указывает. остальные операции над списком (вставка/удаление других элементов) не влияют на валидность итератора.
Здравствуйте, Barbar1an, Вы писали:
V>>Наверно стоит придумать какой-то идентификатор и хранить рядом как пару. Только зачем такое понадобилось вообще? B>event<void()> e; B>e += [](){}; B>а теперь не отпишешься