【问题标题】:C++ Getting a number of elements in variadic templateC ++在可变参数模板中获取许多元素
【发布时间】:2018-12-12 06:00:34
【问题描述】:

所以我试图在我的可变参数模板中获取一些元素,如下所示:

Test(const T& t...);

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

但是它没有编译,我得到以下错误:

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

't' 不是 'sizeof...' 的有效操作数。你的意思是使用 '大小'?

感谢任何帮助。

【问题讨论】:

  • template&lt;typename T&gt; 不是可变参数模板。 template&lt;typename... T&gt; 是。
  • 你的模板只有一个参数T

标签: c++ templates variadic


【解决方案1】:

尝试std::tuple 元编程:std::tuple_size&lt;std::tuple&lt;Types...&gt;&gt;::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;
}

【讨论】:

    【解决方案2】:

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

    inline Class<T>::Test(const T&... t) { /* ... */ }
    

    但是,T 似乎不是参数包。它只是一个单一的类型参数。另外,你把... 放错了地方。所以你真正做的是声明一个函数,它接受一个T 类型的参数,加上一个C 风格的省略号。 (是的,省略号前的逗号是可选的!)

    所以当你写sizeof...(t) 时,编译器会抱怨因为t 不是一个包。这只是一个普通的参数。

    也许您想将Test 声明为接受任意数量参数但所有类型均为const T&amp; 的函数?不幸的是,在当前的 C++ 中没有简单的方法可以做到这一点。有关解决方案,请参阅Specifying one type for all arguments passed to variadic function or variadic template function w/out using array, vector, structs, etc?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多