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? Without it I get the error:
'b': no matching overloaded function found 'int b(int,const std::array<int,N> &)': could not deduce template argument for 'N'
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.