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

Сообщение Re: templated QueryInterface от 11.02.2020 11:30

Изменено 11.02.2020 11:37 rg45

Re: templated QueryInterface
Здравствуйте, The Passenger, Вы писали:

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

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

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


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

      template<typename Interface, typename... Args>         
      bool castInterfaces(             
           REFIID aRefIID,             
           _COM_Outptr_ void __RPC_FAR *__RPC_FAR *aPtrPtrVoidObject,             
           Interface* aThis,             
           Args... aRest)         
      {             

         if (aThis && aRefIID == __uuidof(Interface))
         {                 
             *aPtrPtrVoidObject = aThis;
             return true; 
         }
         return castInterfaces(aRefIID, aPtrPtrVoidObject, aRest...);             
     }
        
     bool castInterfaces(             
          REFIID aRefIID,             
          _COM_Outptr_ void __RPC_FAR *__RPC_FAR *aPtrPtrVoidObject)         
    {             
        return false;
    }
};
Re: templated QueryInterface
Здравствуйте, The Passenger, Вы писали:

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

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

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


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

      template<typename Interface, typename... Args>         
      bool castInterfaces(             
           REFIID aRefIID,             
           _COM_Outptr_ void __RPC_FAR *__RPC_FAR *aPtrPtrVoidObject,             
           Interface* aThis,             
           Args... aRest)         
      {             

         if (aThis && aRefIID == __uuidof(Interface))
         {                 
             *aPtrPtrVoidObject = aThis;
             return true; 
         }
         return castInterfaces(aRefIID, aPtrPtrVoidObject, aRest...);             
     }
        
     bool castInterfaces(             
          REFIID aRefIID,             
          _COM_Outptr_ void __RPC_FAR *__RPC_FAR *aPtrPtrVoidObject)         
    {             
        return false;
    }
};