Задать вопрос
@ImagineTables

Можно ли упихать контролируемый invoke в smart pointer?

Хотелось бы иметь универсальную шаблонную обёртку над разными интерфейсами, чтобы при вызове любого метода клиентом внутри на самом деле происходило следующее: реальный вызов по реальному указателю, проверка результата и обработка ошибок, возврат возможно изменённого результата.

Можно написать вариадический макрос INVOKE(METHOD, ARGS), но обёртка была бы лучше.

MIDL (без raw_interfaces), вроде бы, умеет генерировать обёртку, которая преобразовывает FAILED(hResult) в исключение. Может быть, есть альтернативные препроцессоры IDL, которые позволяют вставлять вместо исключений кастомную обработку ошибок?
  • Вопрос задан
  • 19 просмотров
Подписаться 1 Сложный Комментировать
Помогут разобраться в теме Все курсы
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
через operator-> перехватить произвольный вызов не выйдет, прокси всё равно придётся описывать метод за методом. А если хватит своей реакции на FAILED(hr), то у #import (без raw_interfaces_only) обёртки уже зовут _com_raise_error, и его можно подменить через _set_com_error_handler(&MyHandler). Только обработчик не должен возвращать управление, подменить результат и продолжить так не получится. Для этого остаётся шаблон вида invoke(ptr, &IFoo::Bar, args...) на std::invoke с проверкой hr внутри.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы