c++ - 如何找到参数包的长度?

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

假设我有一个像这样的可变参数模板函数

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

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

最佳答案

使用 sizeof... :

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

注意你不应该使用 unsigned ,但是std::size_t (在 <cstddef> 中定义)。此外,该函数应该是一个常量表达式。


不使用 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
}

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

关于c++ - 如何找到参数包的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2770474/

相关文章:

c++ - 是否建议使用 extern 来避免 header 依赖?

带有 boost::noncopyable 的 C++ 工厂函数

c++ - 可以使用移动/交换 c++11 来延长返回的临时变量的生命周期吗

c++ - c++11 中的模板化 union

c++ - 静态数据成员的类内初始化

c++ - 需要帮助解决 NXP Linux 上的 std::thread::join() 问题

c++ - 模板类的内部类不会在 XCode 4.5.2 上编译

c++ - obj.template operator() 构造不适用于 xlC 11.1

用于方法组和装饰器的 C++ SFINAE

c++ - 覆盖私有(private)函数