В C часто желательно перебирать аргументы шаблона с переменным числом аргументов и выполнять определенную операцию, например вызов функция. Этого можно достичь, используя либо:
(f(args), ...);
Однако, если вызываемая функция потенциально возвращает объект с перегруженным оператором-запятой следует использовать:
((void)f(args), ...);
Обычным подходом является использование инициализации списка и выполнение расширения внутри него:
{ print(Args)... }
Поскольку print() возвращает void , вы можете обойти эту проблему, вернув int:
{ (print(Args), 0)... }
Чтобы убедиться, что это работает с любым числом аргументов, вы можете сделать так, чтобы пакет всегда содержал хотя бы один элемент:
{ 0, (print(Args), 0)... }
Вы можете инкапсулировать этот шаблон в многократно используемый шаблон макрос:
namespace so { using expand_type = int[]; } #define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
Чтобы обрабатывать перегруженные операторы запятой, вы можете изменить макрос:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \ ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
Если вас беспокоит ненужное выделение памяти, вы можете определить собственный тип, поддерживающий список- инициализация, но не сохраняет данные:
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3