C ++在可变参数模板中获取许多元素

时间:2018-12-11 20:51:09

标签: c++ templates variadic

所以我试图在可变参数模板中获得许多元素,如下所示:

Test(const T& t...);

template<typename T>
inline Class<T>::Test(const T& t...){
     int num = sizeof...(t);
     ...
}

但是它无法编译,并且出现以下错误:

  

错误C3523:“ sizeof ...”需要未扩展的参数包作为其自变量

     

't'不是'sizeof ...'的有效操作数。你是说要用   'sizeof'?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果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?

答案 1 :(得分:0)

尝试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;
}