У меня есть список объектов:
std::list<A> objects;
Чтобы запустить асинхронную c операцию, которая удалит их из списка на основе некоторого условия, объекты должны знать свое местоположение в списке:
A::A(std::list<A>::iterator it);
Как передать итератор конструктору при добавлении элементов в список?
objects.emplace(<the iterator to new item>);
Инициализация итератора-члена class A
не может быть выполнена позже, даже конструктор может инициировать операцию удаления, поэтому ему нужен этот член во время построения.
Возможные решения, которые я подумал (вносит дополнительную сложность):
1:
objects.emplcae(A(objects.end())); // dummy object
A a{ std::prev(objects.end()) };
std::swap(a, object.back());
2:
objects.emplace();
objects.back().set_iterator(std::prev(objects.end()));
objects.back().run(); // Moved the work from constructor to this function (against RAII)
3: Попробуйте получить итератор на основе адреса this
.