«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как вызвать функцию для всех аргументов шаблона с переменным числом аргументов в C++?

Как вызвать функцию для всех аргументов шаблона с переменным числом аргументов в C++?

Опубликовано 19 ноября 2024 г.
Просматривать:431

How to Invoke a Function on All Variadic Template Arguments in C  ?

Шаблоны C с переменным числом аргументов: вызов функции для всех аргументов шаблона

В C часто желательно перебирать аргументы шаблона с переменным числом аргументов и выполнять определенную операцию, например вызов функция. Этого можно достичь, используя либо:

C 17 Fold Expression

(f(args), ...);

Однако, если вызываемая функция потенциально возвращает объект с перегруженным оператором-запятой следует использовать:

((void)f(args), ...);

Pre-C 17 Решение

Обычным подходом является использование инициализации списка и выполнение расширения внутри него:

{ 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