当我尝试通过以下函数迭代可变参数时
我不明白 '{(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++17 折叠表达式的 C++14 解决方法,您可以在其中编写:
template<typename ...ParamTypes>
void Func(ParamTypes &...Param)
{
(Print(Param),... );
}
Print(Param),0
调用 Print
,丢弃结果(如果有)并计算为 0。
int arr[] = { (Print(Param),0)... };
创建一堆零的数组,但对于 C++14,这是可以扩展可变参数包的少数地方之一。
就像
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)... };
}