C ++ 11: Numero di parametri della funzione modello Variadic?


87

Come posso ottenere un conteggio del numero di argomenti in una funzione modello variadico?

cioè:

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

    ...
}

Qual è il modo migliore per implementare number_of_argsquanto sopra?


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

22
@ R.MartinhoFernandes il modulo "Pubblica la tua risposta" è qualche centimetro più in là nella parte inferiore della pagina. ;)
kay

@ kay-SEisevil Non capisco perché il tuo commento abbia meno voti positivi del suo.
Sapphire_Brick

Risposte:


104

Basta scrivere questo:

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

Nota che nè un'espressione costante (cioè nota in fase di compilazione), il che significa che puoi usarla dove è necessaria un'espressione costante, come:

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

Nota che se vuoi calcolare la dimensione aggregata dei tipi compressi (in contrapposizione al numero di tipi nel pacchetto), allora devi fare qualcosa del genere:

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 > {};

quindi fai questo:

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

In C ++ 17 (e versioni successive), calcolare la somma delle dimensioni dei tipi è molto più semplice utilizzando l' espressione di piegatura :

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

Spero possa aiutare.


9
+1 Ho imparato due cose; sizeof...e constexpr. :)
Qix - MONICA ERA MALTRATTATA

1
Quindi questo sizeof...restituisce effettivamente il numero di argomenti e non la dimensione di archiviazione combinata di tutti gli argomenti (come sizeoffarebbe su un array)?
panzi

@panzi: Sì. sizeof ...(T)restituisce il numero di tipi confezionati T. Se vuoi calcolare la dimensione aggregata dei tipi compressi, devi fare qualcosa del genere: ideone.com/udggBk Ho aggiunto anche questo nella mia risposta.
Nawaz

@panzi: il calcolo nella mia risposta è leggermente migliorato ora.
Nawaz

2
Con C ++ 17, per calcolare la dimensione dei singoli tipi di arg ora possiamo usare le espressioni di piegatura return (0 + ... + sizeof(t));
P0W
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.