如何循环遍历可变参数列表[重复]

问题描述 投票:0回答:2

当我尝试通过以下函数迭代可变参数时

我不明白 '{(Print(Param),0)... } ' 其中使用了 0

#include<iostream>
using namespace std;


template<typename T>
void Print(T& arg)
{
    cout << arg << endl;

}

template<typename ...ParamTypes>
void Func(ParamTypes &...Param)
{
    int arr[] = { (Print(Param),0)... }; 

}
int main()
{
    int num = 10;

    Func(num,num,num);

    return 0;
}

当我不添加 0 时,它会给我一个错误

c++ templates variadic-templates pack-expansion
2个回答
3
投票

这是 C++17 折叠表达式的 C++14 解决方法,您可以在其中编写:

template<typename ...ParamTypes>
void Func(ParamTypes &...Param)
{
    (Print(Param),... ); 
}

Print(Param),0
调用
Print
,丢弃结果(如果有)并计算为 0。

int arr[] = { (Print(Param),0)... }; 

创建一堆零的数组,但对于 C++14,这是可以扩展可变参数包的少数地方之一。


1
投票

就像

Print
一样,如果(模板)函数返回
void
,则需要一些技巧来在表达式中操作它。这里:

int arr[] = { (Print(Param),0)... }; 

逗号运算符 (

,
) 用于确保
Print
的副作用显现出来,但会返回一些内容:零
int
。事实上,你无法构造一个
void
数组。

提醒一下,逗号运算符计算其左侧操作数,丢弃其结果,最后返回其右侧操作数。

以我的拙见,这是一个糟糕的黑客行为。可以构建更清晰/明确的:

struct side_effect_t
{
    side_effect_t(...) {}
};

template<typename T>
side_effect_t Print(T& arg)
{
    std::cout << arg << '\n';
    return {};
}

template<typename ...ParamTypes>
void Func(ParamTypes &...Param)
{
    side_effect_t{ Print(Param)... };
}

godbold 演示

© www.soinside.com 2019 - 2024. All rights reserved.