Как удалить люмбду
От: Barbar1an Украина  
Дата: 26.07.18 18:06
Оценка: +1
std::function<void(void)> f = [](){};

std::list<std::function<void(void)>> list;

list.push_back(f);

...

list.remove(как найти/удалить нужную лямбу по значению?)
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Как удалить люмбду
От: Кодт Россия  
Дата: 26.07.18 19:35
Оценка: +2
Здравствуйте, Barbar1an, Вы писали:

B>list.remove(как найти/удалить нужную лямбу по значению?)


Как ты знаешь, которая лямбда — "нужная"?

Сами по себе лямбды — не EqualityComparable. (std::function — тоже, несмотря на то, что у них есть operator== — он не над ними, а с nullptr'ом).
Исключение — это когда лямбда не захватывает контекст и является просто анонимной функцией: функции можно сравнивать по указателям.

Так что способов два
— интрузивный — хранить в списке и лямбды, и некоторые их идентификаторы
— неинтрузивный — хранить итератор на элемент списка с "нужной" лямбдой, или иным способом отслеживать положение (порядковый номер и т.п.)
Перекуём баги на фичи!
Re: Как удалить люмбду
От: rg45 СССР  
Дата: 27.07.18 06:37
Оценка:
Здравствуйте, Barbar1an, Вы писали:


B>
B>std::function<void(void)> f = [](){};

B>std::list<std::function<void(void)>> list;

B>list.push_back(f);

B>...

B>list.remove(как найти/удалить нужную лямбу по значению?)
B>


Почему именно по значению, а не по итератору?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Как удалить люмбду
От: andyp  
Дата: 27.07.18 11:13
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>
list.push_back(f);

B>...

B>list.remove(как найти/удалить нужную лямбу по значению?)
B>


Тупые варианты включают:
1. Вызвать всех подряд — заценить сайдэффекты от каждой.
2. pop_back() же

А по нормальному — запомнить итератор, сменить тип контейнера, написать класс-функтор и хранить некий id вместе с лямбдой, по которому можно сравнивать и т.п.
Re: Как удалить люмбду
От: Vain Россия google.ru
Дата: 18.08.18 11:47
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>
B>std::function<void(void)> f = [](){};

B>std::list<std::function<void(void)>> list;

B>list.push_back(f);

B>...

B>list.remove(как найти/удалить нужную лямбу по значению?)
B>

Наверно стоит придумать какой-то идентификатор и хранить рядом как пару. Только зачем такое понадобилось вообще?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Как удалить люмбду
От: Barbar1an Украина  
Дата: 18.08.18 12:40
Оценка:
Здравствуйте, Vain, Вы писали:

V>Наверно стоит придумать какой-то идентификатор и хранить рядом как пару. Только зачем такое понадобилось вообще?


event<void()> e;

e += [](){};

а теперь не отпишешься
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[2]: Как удалить люмбду
От: Barbar1an Украина  
Дата: 18.08.18 12:41
Оценка: -1 :)
Здравствуйте, rg45, Вы писали:

R>Почему именно по значению, а не по итератору?


ну как почему? потому что интератор нельзя хранить ибо он инвалидируется как тока список изменяется
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[3]: Как удалить люмбду
От: const_volatile  
Дата: 18.08.18 13:29
Оценка: +3
Здравствуйте, Barbar1an, Вы писали:

R>>Почему именно по значению, а не по итератору?

B>ну как почему? потому что интератор нельзя хранить ибо он инвалидируется как тока список изменяется

итератор std::list инвалидируется только после удаления элемента, на который он указывает. остальные операции над списком (вставка/удаление других элементов) не влияют на валидность итератора.
Re[3]: Как удалить люмбду
От: B0FEE664  
Дата: 18.08.18 20:58
Оценка:
Здравствуйте, Barbar1an, Вы писали:

V>>Наверно стоит придумать какой-то идентификатор и хранить рядом как пару. Только зачем такое понадобилось вообще?

B>event<void()> e;
B>e += [](){};
B>а теперь не отпишешься

Вопрос ещё актуален?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.