如何使用可变参数模板获取参数的变量号及其大小C++
How to get variable no of argument with its size in C++ using variadic template
我需要创建一个接受参数变量号的函数。此函数的目标是获取参数并打印数据。我已经成功地使用可变参数模板实现了这个函数,其代码如下:
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...);
}
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用