Есть и другая идея
Если вызов Task дошел до функции, где нужно возобновить выполнение - можно просто хранить где то последнюю функцию (точнее, хранить в ней лямбду, которая запомнит данные, которые нужно было передать методу, который локается)
Такой метод генерирует большего размера бинарь и заставляет создавать std::function (не думаю что это дорого, учитывая что .lock'и не всегда и не часто происходят в одном таске), зато этот способ избавляет от 2х вещей: создания серилизатора и использование макросов