Сообщение Re: templated QueryInterface от 11.02.2020 11:30
Изменено 11.02.2020 11:32 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 функции для вариадик и невариадик?
Как по мне, то и так достаточно элегантно — одна функция обепечивает рекурсивный перебор, другая представляет собой обработчик одной итерации. Можно обе задачи поместить в один скоуп, но все равно вторую функцию приется оставить как пустое замыкание рекурсии:
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<Interface>(aRefIID, aPtrPtrVoidObject, aRest...);
}
template<typename Interface>
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 функции для вариадик и невариадик?
Как по мне, то и так достаточно элегантно — одна функция обепечивает рекурсивный перебор, другая представляет собой обработчик одной итерации. Можно обе задачи поместить в один скоуп, но все равно вторую функцию приется оставить как тривиальное замыкание рекурсии:
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<Interface>(aRefIID, aPtrPtrVoidObject, aRest...);
}
template<typename Interface>
bool castInterfaces(
REFIID aRefIID,
_COM_Outptr_ void __RPC_FAR *__RPC_FAR *aPtrPtrVoidObject)
{
return false;
}
};