Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在可变模板中获取多个元素_C++_Templates_Variadic - Fatal编程技术网

C++ C++;在可变模板中获取多个元素

C++ C++;在可变模板中获取多个元素,c++,templates,variadic,C++,Templates,Variadic,所以我试着在我的可变模板中得到一些元素,如下所示: Test(const T& t...); template<typename T> inline Class<T>::Test(const T& t...){ int num = sizeof...(t); ... } 测试(常量测试与测试…); 模板 内联类::测试(常量T&T…){ int num=sizeof…(t); ... } 但是它没有编译,我得到以下错误: 错误C3

所以我试着在我的可变模板中得到一些元素,如下所示:

Test(const T& t...);

template<typename T>
inline Class<T>::Test(const T& t...){
     int num = sizeof...(t);
     ...
}
测试(常量测试与测试…);
模板
内联类::测试(常量T&T…){
int num=sizeof…(t);
...
}
但是它没有编译,我得到以下错误:

错误C3523:“sizeof…”需要一个未展开的参数包作为其参数

“t”不是“sizeof…”的有效操作数。你是想用 “sizeof”


非常感谢您的帮助。

如果
T
是一个参数包,您可以使用以下语法声明一个函数,该函数接受一系列参数,其类型与参数包中的参数类型相对应:

inline Class<T>::Test(const T&... t) { /* ... */ }
内联类::Test(常量T&…T){/*…*/}
但是,
T
似乎不是一个参数包。它只是一个类型参数。另外,您将
放错了位置。因此,您真正做的是声明一个函数,该函数接受一个类型为
T
的参数,外加一个C样式的省略号。(是的,省略号前的逗号是可选的!)

因此,当您编写
sizeof…(t)
时,编译器会抱怨,因为
t
不是一个包。这只是一个正常的参数


也许您想将
Test
声明为一个接受任意数量参数的函数,但所有类型都是
const T&
?不幸的是,在当前C++中没有简单的方法来实现这一点。有关解决方案,请参阅

Try
std::tuple
元编程:
std::tuple\u size::value
生成类型参数的数量。例如,此代码打印
4

#include <iostream>
#include <tuple>
#include <cstddef>

template<typename ...Types>
constexpr std::size_t Test(Types&& ... args){
    constexpr std::size_t sz = std::tuple_size<std::tuple<Types...>>::value;
    return sz;
}

int main()
{
    std::size_t val = Test(0, 0L, 'a', std::cin);
    std::cout << val;
}
#包括
#包括
#包括
模板
constexpr标准::大小测试(类型和参数){
constexpr std::size\u t sz=std::tuple\u size::value;
返回sz;
}
int main()
{
标准:尺寸=试验(0,0升,'a',标准:cin);

std::cout
template
不是可变模板。
template
是可变模板。您的模板只有一个参数T