Как найти длину пакета параметров? - PullRequest
6 голосов
/ 05 мая 2010

Предположим, у меня есть шаблонная функция с переменным значением, такая как

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

Как найти длину списка параметров с помощью функции длины?

1 Ответ

13 голосов
/ 05 мая 2010

Использование 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
}

Обратите внимание, что все полностью не проверено.

...