Search code examples
c++templatesgeneric-programming

Ellipsis appears in a parameter declaration of a template function


This is the example from cppreference. I don't understand how the pattern get expanded.

template<typename ...Ts, int... N> void g(Ts (&...arr)[N]) {}
int n[1];
g<const char, int>("a", n); // Ts (&...arr)[N] expands to 
                            // const char (&)[2], int(&)[1]

Note: In the pattern Ts (&...arr)[N], the ellipsis is the innermost element, not the last element as in all other pack expansions.

Question 1: what is arr?

Question 2: n is a int array, does it match to int...N?

Question 3: How come it can expand to const char (&)[2], int(&)[1]


Solution

  • Whereas

    template <typename ...Ts> void f(Ts&...arr);
    

    is mostly equivalent to

    template <typename T0, typename T1, .., typename TN>
    void f(T0& arr0, T1& arr1, .., TN& arrN);
    

    for any N.

    In the same way,

    template <typename ...Ts, int... Ns> void g(Ts (&...arr)[Ns]);
    

    would be equivalent to

    template <typename T0, typename T1, .., typename TN, int N0, int N1, .. int NN>
    void g(T0 (&arr0)[N0], T1 (&arr1)[N1], .., TN (&arrN)[NN]);
    

    and type T (&)[N] is a reference to C-array of size N with element of type T

    int n[1]; is trivially of type int [1].

    "a" is of type const char[2] ({'a', '\0'}).