我需要创建一个函数,该函数接受变量no。该函数的目的是获取参数并打印数据。我已经成功使用可变参数模板实现了此功能,其代码如下:
void print(T var1, Types... var2)
{
cout << "DATA:"<<var1<< endl ;
print(var2...) ;
}
但是现在我也想打印参数的大小。例如:
char empname[15+1];
print(empname);
它应该打印empname的大小:16。但是它打印8,因为它是打印模板参数数据类型的大小。
以任何方式获取参数包中每个参数的大小,因为我仍在学习C ++ 11可变参数模板。
我认为您正在尝试做类似的事情:
((请下次输入您的完整代码,])>
void print() {} template <typename T, typename... Types> void print(T var1, Types... var2) { cout << "SIZE:"<<sizeof(var1)<< endl ; print(var2...) ; }
并且当您尝试运行此命令时:
char empname[15+1]; print(empname);
您得到的是
SIZE:8
,即char *
的大小。将数组传递给函数参数时,它会衰减为指针。这是因为Array-to-pointer decay。
因此,如果您手动将模板参数指定为数组引用,则可以正常工作。
char empname[15+1]; print<char (&)[16]>(empname);
但是这可能不是您想要的。为了防止衰减,您可以将参数类型更改为引用。详细说明是here。
template <typename T, typename... Types>
void print(T& var1, Types&... var2)
{
cout << "SIZE:"<<sizeof(var1)<< endl ;
print(var2...) ;
}
只需在@Hanjoung Lee的答案中添加另一个示例,您还可以像这样获得数组的大小: