Deduce std::array size?

c++, c++14

Solution

C++17 `std::array` class template argument deduction (CTAD)

Starting with C++17, this new language feature is now used by the standard library and now allows us to omit the template types as well so that the following works:

main.cpp

#include <array>

int main() {
    std::array a{1, 2, 3};
}

instead of `std::array<int, 3> a{1, 2, 3};`

Tested with:

g++ -ggdb3 -O0 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp

If we set `-std=c++14` instead for example, it fails to compile with:

error: missing template arguments before ‘a’

Tested on Ubuntu 18.04, GCC 7.5.0.

Problem

In the following code: ``` template<size_t N> int b(int q, const std::array<int, N>& types) { int r = q; for (int t : types) { r = r + t; } return r; } int main() { b<2>(9, { 2,3 }); } ``` How can I avoid having to specify 2 in the call to b for N? Why can't this type be automatically deduced? With out it I get the error: 'b': no matching overloaded function found 'int b(int,const std::array &)': could not deduce template argument for 'N'

Original source

Related problems