英文:
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);
它应该打印出empname
的大小:16。但它打印出8,因为它打印出了模板参数的数据类型大小。
有没有办法获取参数包中每个参数的大小?因为我仍然在学习C++11的可变模板。
英文:
I need to create a function which take variable no of argument. The objective of this function will be to get argument and print the data. I have succeeded in implementing this function using variadic template whose code is given below:
void print(T var1, Types... var2)
{
cout << "DATA:"<<var1<< endl ;
print(var2...) ;
}
But now i want to print the size of argument as well . For e.g:
char empname[15+1];
print(empname);
It should print size of empname : 16 . But it print 8 as it is printing size of datatype of template argument.
Any way out to get size of each argument in parameter pack as i am still learning C++11 variadic template.
答案1
得分: 3
我假设你想要做类似以下的事情:
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...);
}
英文:
I assume that you are trying to do something like:
(Please put up your entire code you tried, next time)
void print() {}
template <typename T, typename... Types>
void print(T var1, Types... var2)
{
cout << "SIZE:"<<sizeof(var1)<< endl ;
print(var2...) ;
}
And when you try run this:
char empname[15+1];
print(empname);
You get SIZE:8
which is the size of char *
. The array is decayed to a pointer when it is passed to a function parameter. This is because of Array-to-pointer decay.
So if you specify the template parameter manually as an array-reference, then it works fine.
char empname[15+1];
print<char (&)[16]>(empname);
However this probably not be what you want. To prevent the decays, you can just change the argument type to reference. Detailed description is here.
template <typename T, typename... Types>
void print(T& var1, Types&... var2)
{
cout << "SIZE:"<<sizeof(var1)<< endl ;
print(var2...) ;
}
答案2
得分: 2
只是为了补充@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...);
}
英文:
Just to add another example to @Hanjoung Lee's answer, you could also get the size of your array like this :
template <typename T, std::size_t Size, typename... Types>
void print(T (&)[Size], Types&... var2)
{
std::cout << "SIZE:" << Size << std::endl;
print(var2...);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论