В идеальном мире return_value/void и final_suspend это одна функция.
На текущий момент времени этого уже сделать нельзя, к тому же возможно имеются сложности в реализации этого на уровне компилятора (из-за эксепшенов).
Поэтому предлагается позволить писать:
template <typename T>
auto final_suspend();
А компилятор вызовет final_suspend с типом параметра вызванного return_value.
Тогда в final_suspend мы можем понять, какая из перегрузок return_value была выбрана.
Я столкнулся с тем, что хочу возвращать разные типы в final_suspend.
Для того чтобы реализовать "future unwrapping", иначе говоря вернуть асинхронной задачу из асинхронной задачи без ожидания (пусть и неблокирующего)
Понятно что это не что-то критичное, но почему нет?
К тому же я думаю со временем примеров станет больше.
По сути сюда подходит любое поведение, которое отличается в зависимости от возвращаемого типа.
Например возможны оптимизации на не хранение того что у нас есть отмена.
Или запуск ленивой задачи при возврате из асинхронной.
В идеальном мире return_value/void и final_suspend это одна функция.
На текущий момент времени этого уже сделать нельзя, к тому же возможно имеются сложности в реализации этого на уровне компилятора (из-за эксепшенов).
Поэтому предлагается позволить писать:
А компилятор вызовет final_suspend с типом параметра вызванного return_value. Тогда в final_suspend мы можем понять, какая из перегрузок return_value была выбрана.
https://github.com/YACLib/YACLib/issues/189
Я столкнулся с тем, что хочу возвращать разные типы в final_suspend. Для того чтобы реализовать "future unwrapping", иначе говоря вернуть асинхронной задачу из асинхронной задачи без ожидания (пусть и неблокирующего)
Понятно что это не что-то критичное, но почему нет? К тому же я думаю со временем примеров станет больше. По сути сюда подходит любое поведение, которое отличается в зависимости от возвращаемого типа. Например возможны оптимизации на не хранение того что у нас есть отмена. Или запуск ленивой задачи при возврате из асинхронной.