如何使用可变参数模板获取参数的变量号及其大小C++

How to get variable no of argument with its size in C++ using variadic template

本文关键字:参数 C++ 变量 获取 何使用 变参      更新时间:2023-10-16

我需要创建一个接受参数变量号的函数。此函数的目标是获取参数并打印数据。我已经成功地使用可变参数模板实现了这个函数,其代码如下:

void print(T var1, Types... var2) 
{ 
cout << "DATA:"<<var1<< endl ;      
print(var2...) ; 
}

但是现在我也想打印参数的大小.例如:

char empname[15+1];
print(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 *的大小。当数组传递给函数参数时,数组将衰减为指针。这是因为数组到指针衰减。

因此,如果您手动将模板参数指定为数组引用,那么它可以正常工作。

char empname[15+1];
print<char (&)[16]>(empname);

但是,这可能不是您想要的。为了防止衰减,您只需将参数类型更改为引用即可。详细说明在这里。

template <typename T, typename... Types>
void print(T& var1, Types&... var2)
{
cout << "SIZE:"<<sizeof(var1)<< endl ;
print(var2...) ;
}

为了@Hanjoung Lee 的答案添加另一个示例,您还可以像这样获得数组的大小:

template <typename T, std::size_t Size, typename... Types>
void print(T (&)[Size], Types&... var2)
{
std::cout << "SIZE:" << Size << std::endl;
print(var2...);
}