Я думаю, что remove_if немного излишне из-за того, что задан пытается сделать. Все, что нужно сделать, это сохранить местоположение или значение элемента, чтобы позже удалить этот конкретный элемент.
Как предложил Марк, вы можете сохранить итератор для объекта и использовать его для удаления элемента с помощью вызова стирания, как показано ниже:
MY_STRUCT struct;
myList.push_back(struct);
myList.push_back(struct);
std::list<MY_STRUCT>::iterator del_it = myList.end() - 1;
myList.erase(del_it);
Или, если ваша структура имеет оператор ==, определенный для MY_STRUCT, вы можете сохранить значение самого объекта и использовать метод удаления
MY_STRUCT struct1;
MY_STRUCT struct2;
myList.push_back(struct1);
myList.push_back(struct2);
myList.remove(struct2);
Конечно, если вы сделаете свой список списком указателей, вам не нужно беспокоиться об операторе ==, так как он уже определен для типов указателей. Просто убедитесь, что если вы выполняете итерацию по списку и вызываете erase, вам необходимо обновить свой итератор возвращаемым значением.
Кроме того, метод remove удаляет все элементы переданного значения, поэтому, если вы хотите удалить только 1 элемент за раз, сохраните итератор, а не значение.
Этот код не проверен, поэтому я приветствую любые исправления.