abraham_hilbert abraham_hilbert - 1 month ago 10
C++ Question

Deduce template argument for size of initializer list

I have the following (not compilable) code:

template< size_t N >
void foo( std::array<int, N> )
{
// Code, where "N" is used.
}

int main()
{
foo( { 1,2 } );
}


Here, I want to pass an arbitrary number of
int
s to a function
foo
-- for convenience, I will use the
std::initializer_list
notation.
I tried to use an
std::array
to aggregate the
int
s (as shown in the code above), however, the compiler can not deduce the array size since the
int
s are passed as an
std::initializer_list
.

Using an
std::initializer_list
instead of an
std::array
also does not solve the problem since (in contrast to
std::array
) the size of the
std::initializer_list
is not captured as template argument.

Does anyone know which data structure can be used so that the
int
s can be passed by using the
std::initializer_list
notation and without passing the template argument
N
of
foo
explicitly?

Many thanks in advance

Answer

Thanks to core issue 1591, you can use

template <std::size_t N>
void foo( int const (&arr)[N] )
{
  // Code, where "N" is used.
}

foo({1, 2, 3});
Comments