如何使用可变参数模板在C ++中获取其大小不可变的参数

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

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

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

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

char empname[15+1];
print(empname);

它应该打印empname的大小:16。但是它打印8,因为它是打印模板参数数据类型的大小。

以任何方式获取参数包中每个参数的大小,因为我仍在学习C ++ 11可变参数模板。

c++ c++11 variadic-templates
2个回答
2
投票

我认为您正在尝试做类似的事情:

((请下次输入您的完整代码,])>

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...) ;
}

2
投票

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

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