У меня есть функция, которая принимает два аргумента:
template <typename T1, typename T2>
void foo(T1 arg1, T2 arg2)
{ std::cout << arg1 << " + " << arg2 << '\n'; }
И переменный, который должен передавать свои аргументы в парах:
template <typename... Args>
void bar(Args&&... args) {
static_assert(sizeof...(Args) % 2 == 0);
( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... );
// ^ Sends each argument twice, not in pairs
}
Я хотел бы bar(1,2,3,4)
позвонить foo(1,2)
иfoo(3,4)
Есть способ сделать это ?
c++
c++11
templates
variadic-templates
Fourmet
источник
источник
Ответы:
Вы можете сделать это с перегрузками.
ЖИТЬ
Обратите внимание, что при использовании приведенного выше минимального фрагмента при вызове
bar
с 0 или нечетными аргументами вы не получите ошибку соответствующей функции . Если вы хотите более четкое сообщение с компиляцией,static_assert
вы можете начать с этого фрагмента .источник
Простая рекурсия с использованием
if constexpr
:Назовите это так:
демонстрация
Я бы сказал, что ответ Songyanyao довольно канонический до C ++ 17. Впоследствии
if constexpr
это позволило нам перемещать логику в тела наших функций вместо использования трюков с перегрузкой.источник
Обобщение C ++ 17 для
n
-ных функторов:источник