Здравствуйте, The Passenger, Вы писали:
TP>Понадобилось тут создать базовый для IUnknown ... тянуть ATL было лень TP>стал смотреть в сторону статической типизации на шаблонах, нашел такое — TP>https://www.codeproject.com/Tips/1057327/Variadic-Template-Technique-and-COM-Unusual-Soluti
TP>Можно ли сделать с 14 или 17 плусами это поэлегантнее — без разбивки на 2 функции для вариадик и невариадик?
Как по мне, то и так достаточно элегантно — одна функция обепечивает рекурсивный перебор, другая представляет собой обработчик одной итерации. Можно обе задачи поместить в один скоуп, но все равно вторую функцию прийдется оставить как тривиальное замыкание рекурсии:
что именно в данном решении не устраивает?
вторая функция нужна для завершения обхода.
ее можно сделать без аргументов, всегда возвращающую фалсе.
можно поставить проверку в
if constexpr(sizeof...(Args) > 0)
но не уверен, что это будет боле наглядно.
Здравствуйте, 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) и запихнуть все в одну функцию таким образом (не компилил):
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, The Passenger, Вы писали:
TP>>https://www.codeproject.com/Tips/1057327/Variadic-Template-Technique-and-COM-Unusual-Soluti
TP>>Можно ли сделать с 14 или 17 плусами это поэлегантнее — без разбивки на 2 функции для вариадик и невариадик?
NB>что именно в данном решении не устраивает? NB>вторая функция нужна для завершения обхода. NB>ее можно сделать без аргументов, всегда возвращающую фалсе. NB>можно поставить проверку в NB>if constexpr(sizeof...(Args) > 0) NB>но не уверен, что это будет боле наглядно.
Здравствуйте, 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 функции для вариадик и невариадик?
Здравствуйте, rg45, Вы писали:
R>Впрочем, здесь можно было бы заюзать fold expressions (C++17) и запихнуть все в одну функцию таким образом (не компилил):
Да, на всякий случай. Для того, чтобы корректно обрабатывался пустой список интерфейсов, вид fold-expression нужно слегка изменить:
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, rg45, Вы писали:
R>>Впрочем, здесь можно было бы заюзать fold expressions (C++17) и запихнуть все в одну функцию таким образом (не компилил):
R>Да, на всякий случай. Для того, чтобы корректно обрабатывался пустой список интерфейсов, вид fold-expression нужно слегка изменить:
R>
When a unary fold is used with a pack expansion of length zero, only the following operators are allowed:
1) Logical AND (&&). The value for the empty pack is true
2) Logical OR (||). The value for the empty pack is false
3) The comma operator (,). The value for the empty pack is void()
Нет проблемы с пустым списком. Просто вернёт false.