C ++在可变参数模板中获取多个元素
C++ Getting a number of elements in variadic template
所以我试图在我的可变参数模板中获取一些元素,如下所示:
Test(const T& t...);
template<typename T>
inline Class<T>::Test(const T& t...){
int num = sizeof...(t);
...
}
但是它没有编译,我得到以下错误:
error C3523: 'sizeof...' requires as its argument an unexpanded parameter pack
't' is not a valid operand for 'sizeof...'. Did you mean to use
'sizeof'?
感谢任何帮助。
如果 T
是一个参数包,您可以使用以下语法声明一个函数,该函数接受一系列参数,其类型与参数包中的参数相对应:
inline Class<T>::Test(const T&... t) { /* ... */ }
但是,T
似乎不是参数包。它只是一个单一的类型参数。另外,您将 ...
放在了错误的位置。因此,您真正做的是声明一个函数,该函数采用 T
类型的单个参数,外加一个 C 风格的省略号。 (是的,省略号前的逗号是可选的!)
所以当你写 sizeof...(t)
时,编译器会报错,因为 t
不是一个包。只是一个普通的参数。
也许您想将 Test
声明为一个函数,该函数接受任意数量的参数,但所有类型都是 const T&
?不幸的是,在当前的 C++ 中没有简单的方法可以做到这一点。有关解决方案,请参阅 Specifying one type for all arguments passed to variadic function or variadic template function w/out using array, vector, structs, etc?。
尝试std::tuple
元编程:std::tuple_size<std::tuple<Types...>>::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;
}
所以我试图在我的可变参数模板中获取一些元素,如下所示:
Test(const T& t...);
template<typename T>
inline Class<T>::Test(const T& t...){
int num = sizeof...(t);
...
}
但是它没有编译,我得到以下错误:
error C3523: 'sizeof...' requires as its argument an unexpanded parameter pack
't' is not a valid operand for 'sizeof...'. Did you mean to use 'sizeof'?
感谢任何帮助。
如果 T
是一个参数包,您可以使用以下语法声明一个函数,该函数接受一系列参数,其类型与参数包中的参数相对应:
inline Class<T>::Test(const T&... t) { /* ... */ }
但是,T
似乎不是参数包。它只是一个单一的类型参数。另外,您将 ...
放在了错误的位置。因此,您真正做的是声明一个函数,该函数采用 T
类型的单个参数,外加一个 C 风格的省略号。 (是的,省略号前的逗号是可选的!)
所以当你写 sizeof...(t)
时,编译器会报错,因为 t
不是一个包。只是一个普通的参数。
也许您想将 Test
声明为一个函数,该函数接受任意数量的参数,但所有类型都是 const T&
?不幸的是,在当前的 C++ 中没有简单的方法可以做到这一点。有关解决方案,请参阅 Specifying one type for all arguments passed to variadic function or variadic template function w/out using array, vector, structs, etc?。
尝试std::tuple
元编程:std::tuple_size<std::tuple<Types...>>::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;
}