C++11:可变参数模板函数参数的数量?

Posted

技术标签:

【中文标题】C++11:可变参数模板函数参数的数量?【英文标题】:C++11: Number of Variadic Template Function Parameters? 【发布时间】:2012-08-14 23:52:38 【问题描述】:

如何计算可变参数模板函数的参数数量?

即:

template<typename... T>
void f(const T&... t)

    int n = number_of_args(t);

    ...

在上面实现number_of_args 的最佳方式是什么?

【问题讨论】:

sizeof...(T). @R.MartinhoFernandes “发布您的答案”表格距离页面底部几英寸。 ;) @kay-SEisevil 我不明白为什么你的评论的点赞数比他的少。 【参考方案1】:

就这样写吧:

const std::size_t n = sizeof...(T); //you may use `constexpr` instead of `const`

请注意,n 是一个常量表达式(即在编译时已知),这意味着您可以在需要常量表达式的地方使用它,例如:

std::array<int,   n>  a; //array of  n elements
std::array<int, 2*n>  b; //array of (2*n) elements

auto middle = std::get<n/2>(tupleInstance);

请注意,如果您想计算打包类型的聚合大小(而不是包中类型的 number 个),那么您必须执行以下操作:

template<std::size_t ...>
struct add_all : std::integral_constant< std::size_t,0 > ;

template<std::size_t X, std::size_t ... Xs>
struct add_all<X,Xs...> : 
  std::integral_constant< std::size_t, X + add_all<Xs...>::value > ;

然后这样做:

constexpr auto size = add_all< sizeof(T)... >::value;

在 C++17(及更高版本)中,使用 fold 表达式计算类型大小的总和要简单得多:

constexpr auto size = (sizeof(T) + ...);

希望对您有所帮助。

【讨论】:

+1 学到了两件事; sizeof...constexpr。 :) 所以这个sizeof...实际上返回的是参数的数量,而不是所有参数的组合存储大小(就像数组上的sizeof一样)? @panzi:是的。 sizeof ...(T) 返回封装在 T 中的 number 个类型。如果您想计算打包类型的聚合大小,那么您必须执行以下操作:ideone.com/udggBk 我也在我的答案中添加了这个。 @panzi:我的答案中的计算现在略有改进。 使用 C++17,现在我们可以使用折叠表达式 return (0 + ... + sizeof(t)); 来计算单个 arg 类型的大小【参考方案2】:
#include <iostream>

template<typename ...Args>
struct SomeStruct

    static const int size = sizeof...(Args);
;

template<typename... T>
void f(const T&... t)

    // this is first way to get the number of arguments
    constexpr auto size = sizeof...(T);
    std::cout<<size <<std::endl;


int main ()

    f("Raje", 2, 4, "ASH");
    // this is 2nd way to get the number of arguments
    std::cout<<SomeStruct<int, std::string>::size<<std::endl;
    return 0;

【讨论】:

以上是关于C++11:可变参数模板函数参数的数量?的主要内容,如果未能解决你的问题,请参考以下文章

C++11 ——— 可变参数模板

C++11 ——— 可变参数模板

如何使用可变参数模板参数保存可变数量的参数?

C/C++中的可变参数和可变参数模板

[C++11 模板的改进] --- 可变参数模板

C++11新特性:9—— C++11在函数模板和类模板中使用可变参数