Информация об изменениях

Сообщение Re[2]: templated QueryInterface от 11.02.2020 11:51

Изменено 11.02.2020 12:45 rg45

Re[2]: templated QueryInterface
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, The Passenger, Вы писали:


TP>>Понадобилось тут создать базовый для IUnknown ... тянуть ATL было лень

TP>>стал смотреть в сторону статической типизации на шаблонах, нашел такое —
TP>>https://www.codeproject.com/Tips/1057327/Variadic-Template-Technique-and-COM-Unusual-Soluti

TP>>Можно ли сделать с 14 или 17 плусами это поэлегантнее — без разбивки на 2 функции для вариадик и невариадик?


R>Как по мне, то и так достаточно элегантно — одна функция обепечивает рекурсивный перебор, другая представляет собой обработчик одной итерации. Можно обе задачи поместить в один скоуп, но все равно вторую функцию прийдется оставить как тривиальное замыкание рекурсии:


Впрочем, здесь можно было бы заюзать fold expressions (C++17) и запихнуть все в одну функцию таким образом (не компилил):

      template<typename... Interfaces>         
      bool castInterfaces(             
           REFIID aRefIID,             
           _COM_Outptr_ void __RPC_FAR *__RPC_FAR *aPtrPtrVoidObject,             
           Interfaces... interfaces)         
      {             
         auto checkInterface = [&](auto&& aThis)
         {
           if (aThis && aRefIID == __uuidof(Interface))
           {                 
             *aPtrPtrVoidObject = aThis;
             return true; 
           }
           return false;
         };
         return (checkInterface(interfaces) || ...);             
     }
Re[2]: templated QueryInterface
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, The Passenger, Вы писали:


TP>>Понадобилось тут создать базовый для IUnknown ... тянуть ATL было лень

TP>>стал смотреть в сторону статической типизации на шаблонах, нашел такое —
TP>>https://www.codeproject.com/Tips/1057327/Variadic-Template-Technique-and-COM-Unusual-Soluti

TP>>Можно ли сделать с 14 или 17 плусами это поэлегантнее — без разбивки на 2 функции для вариадик и невариадик?


R>Как по мне, то и так достаточно элегантно — одна функция обепечивает рекурсивный перебор, другая представляет собой обработчик одной итерации. Можно обе задачи поместить в один скоуп, но все равно вторую функцию прийдется оставить как тривиальное замыкание рекурсии:


Впрочем, здесь можно было бы заюзать fold expressions (C++17) и запихнуть все в одну функцию таким образом (не компилил):

      template<typename... Interfaces>         
      bool castInterfaces(             
           REFIID aRefIID,             
           _COM_Outptr_ void __RPC_FAR *__RPC_FAR *aPtrPtrVoidObject,             
           Interfaces*... interfaces)         
      {             
         auto checkInterface = [&](auto* aThis)
         {
           if (aThis && aRefIID == __uuidof(decltype(*aThis)))
           {                 
             *aPtrPtrVoidObject = aThis;
             return true; 
           }
           return false;
         };
         return (checkInterface(interfaces) || ...);             
     }