Можно ли упихать контролируемый invoke в smart pointer?
Хотелось бы иметь универсальную шаблонную обёртку над разными интерфейсами, чтобы при вызове любого метода клиентом внутри на самом деле происходило следующее: реальный вызов по реальному указателю, проверка результата и обработка ошибок, возврат возможно изменённого результата.
Можно написать вариадический макрос INVOKE(METHOD, ARGS), но обёртка была бы лучше.
MIDL (без raw_interfaces), вроде бы, умеет генерировать обёртку, которая преобразовывает FAILED(hResult) в исключение. Может быть, есть альтернативные препроцессоры IDL, которые позволяют вставлять вместо исключений кастомную обработку ошибок?
через operator-> перехватить произвольный вызов не выйдет, прокси всё равно придётся описывать метод за методом. А если хватит своей реакции на FAILED(hr), то у #import (без raw_interfaces_only) обёртки уже зовут _com_raise_error, и его можно подменить через _set_com_error_handler(&MyHandler). Только обработчик не должен возвращать управление, подменить результат и продолжить так не получится. Для этого остаётся шаблон вида invoke(ptr, &IFoo::Bar, args...) на std::invoke с проверкой hr внутри.