C ++ 11: Кількість параметрів функції варіативного шаблону?


87

Як я можу отримати підрахунок кількості аргументів для функції варіативного шаблону?

тобто:

template<typename... T>
void f(const T&... t)
{
    int n = number_of_args(t);

    ...
}

Який найкращий спосіб реалізувати number_of_argsу вищезазначеному?


28
sizeof...(T).
R. Martinho Fernandes

21
@ R.MartinhoFernandes форма "Опублікуйте свою відповідь" знаходиться на кілька сантиметрів нижче до кінця сторінки. ;)
kay

@ kay-SEisevil Я не розумію, чому ваш коментар має менше голосів проти, ніж його.
Sapphire_Brick

Відповіді:


103

Просто напишіть це:

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);

Зверніть увагу, що якщо ви хочете обчислити загальний розмір упакованих типів (на відміну від кількості типів у пакеті), то вам слід зробити щось подібне:

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) + ...);

Сподіваюся, що це допомагає.


9
+1 Дізнався дві речі; sizeof...і constexpr. :)
Qix - МОНІКУ ПОВИНУЛИ

1
Отже, це sizeof...фактично повертає кількість аргументів, а не загальний обсяг пам’яті всіх аргументів (як sizeofу масиві)?
panzi

@panzi: Так. sizeof ...(T)повертає кількість типів, упакованих у T. Якщо ви хочете обчислити загальний розмір упакованих типів, то вам слід зробити щось подібне: ideone.com/udggBk Я також додав це у своїй відповіді.
Nawaz

@panzi: обчислення в моїй відповіді трохи вдосконалено.
Nawaz

2
За допомогою C ++ 17 для обчислення розміру окремих типів аргументів тепер ми можемо використовувати вирази складання return (0 + ... + sizeof(t));
P0W
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.