В следующем коде:
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 });
}
Как я могу избежать необходимости указывать 2 в вызове b для N? Почему этот тип не может быть автоматически выведен? С этим я получаю ошибку:
‘b’: не найдена соответствующая перегруженная функция ‘int b (int, const
станд :: массив &) ‘: не удалось вывести аргумент шаблона для’ N ‘
Вывод аргумента шаблона основан на прямом сопоставлении типов между фактическим аргументом и формальным аргументом. Фактическим аргументом является список инициализатора. Это не соответствует array
тип (в лучшем случае это может соответствовать внутреннему массиву необработанных std::array
, но языковые правила этого не поддерживают).
Вместо этого вы можете просто использовать необработанный массив:
#include <stddef.h>
#include <array>
template<size_t N>
int b(int q, int const (&types)[N] )
{
int r = q;
for (int t : types)
{
r = r + t;
}
return r;
}
int main()
{
b( 9, { 2, 3 } );
}
Или, если вам совсем не нужно N
во время компиляции вы можете использовать std::initializer_list
,
Существует также много других, возможно, подходящих подходов (например, функция шаблонов с переменным числом аргументов или определение оператора для создания std::vector
), но трудно сказать, что подойдет для вашей нераскрытой цели.
Для выведения std::array
Размер, который вы можете использовать общие лямбды (C ++ 14):
auto b = [](int q, const auto& types) {
int r = q;
for (int t : types)
{
r = r + t;
}
return r;
};
int main() {
std::array<int, 2> arr = {{2,3}};
b(9, arr);
}
когда std::make_array
(это находится в Библиотеке Основы TS) будет реализован компиляторами (или вы будете использовать какой-то собственный реализация этого) вам также не нужно передавать размер массива при построении, просто используйте
b(9, std::make_array(2,3));