【问题标题】:How to find the length of a parameter pack?如何找到参数包的长度?
【发布时间】:2010-05-05 03:45:20
【问题描述】:

假设我有一个可变参数模板函数,比如

template<typename... Args>
unsigned length(Args... args);

如何使用长度函数找到参数列表的长度?

【问题讨论】:

    标签: c++ templates c++11 variadic-functions variadic


    【解决方案1】:

    使用sizeof...:

    template<typename... Args>
    constexpr std::size_t length(Args...)
    {
        return sizeof...(Args);
    }
    

    请注意,您不应使用unsigned,而应使用std::size_t(在&lt;cstddef&gt; 中定义)。另外,函数应该是一个常量表达式。


    不使用sizeof...

    namespace detail
    {
        template<typename T>
        constexpr std::size_t length(void)
        {
            return 1; // length of 1 element
        }
    
        template<typename T, typename... Args>
        constexpr std::size_t length(void)
        {
            return 1 + length<Args...>(); // length of one element + rest
        }
    }
    
    template<typename... Args>
    constexpr std::size_t length(Args...)
    {
        return detail::length<Args...>(); // length of all elements
    }
    

    注意,一切都完全未经测试。

    【讨论】:

    • 我想知道我们是否可以通过在每次迭代中减小模板 Args 的大小并在参数数量变为 1 时定义基本情况来重新计算长度函数。我们不断增加每次迭代都有一个计数器。我只是无法将我的想法变成代码..
    • @Eternal:是的,你可以,但是解决问题而不是重新实现运算符不是更有趣吗?
    • 可变参数模板不像 LISP...基本情况应该是空列表。
    • @Potato:什么意思?怎么会有一个空的模板列表?
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2020-07-27
    • 2014-05-04
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多