Сообщение Re[2]: templated QueryInterface от 11.02.2020 11:51
Изменено 11.02.2020 11:52 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 и запихнуть все в одну функцию таким образом (не компилил):
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 и запихнуть все в одну функцию таким образом (не компилил):
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 и запихнуть все в одну функцию таким образом (не компилил):
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 и запихнуть все в одну функцию таким образом (не компилил):
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) || ...);
}