C ++ 11: Anzahl der Variadic Template-Funktionsparameter?

84

Wie kann ich die Anzahl der Argumente für eine variable Vorlagenfunktion ermitteln?

dh:

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

    ...
}

Was ist der beste Weg, um number_of_argsdas oben genannte zu implementieren ?

Andrew Tomazos
quelle
26
sizeof...(T).
R. Martinho Fernandes
20
@ R.MartinhoFernandes Das Formular "Post Your Answer" befindet sich einige Zentimeter weiter unten auf der Seite. ;)
Kay - SE ist böse
@ kay-SEisevil Ich verstehe nicht, warum dein Kommentar weniger positive Stimmen hat als sein.
Sapphire_Brick

Antworten:

100

Schreiben Sie einfach Folgendes:

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

Beachten Sie, dass dies nein konstanter Ausdruck ist (dh zur Kompilierungszeit bekannt ist). Dies bedeutet, dass Sie ihn verwenden können, wenn ein konstanter Ausdruck erforderlich ist, z.

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

Beachten Sie, dass Sie Folgendes tun müssen , wenn Sie die aggregierte Größe der gepackten Typen berechnen möchten (im Gegensatz zur Anzahl der Typen im Paket):

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

dann mach das:

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

In C ++ 17 (und höher) ist die Berechnung der Summe der Größen der Typen mithilfe des Fold- Ausdrucks viel einfacher :

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

Hoffentlich hilft das.

Nawaz
quelle
9
+1 Zwei Dinge gelernt; sizeof...und constexpr. :)
Qix - MONICA wurde am
1
Dies gibt also sizeof...tatsächlich die Anzahl der Argumente und nicht die kombinierte Speichergröße aller Argumente zurück (wie dies sizeofbei einem Array der Fall wäre)?
Panzi
@panzi: Ja. sizeof ...(T)Gibt die Anzahl der eingepackten Typen zurück T. Wenn Sie die aggregierte Größe der gepackten Typen berechnen möchten, müssen Sie Folgendes tun: ideone.com/udggBk Ich habe dies auch in meiner Antwort hinzugefügt.
Nawaz
@panzi: Die Berechnung in meiner Antwort ist jetzt leicht verbessert.
Nawaz
2
Mit C ++ 17 können wir jetzt zur Berechnung der Größe einzelner Arg-Typen Fold-Ausdrücke verwenden return (0 + ... + sizeof(t));
P0W