Вывести std :: размер массива?

В следующем коде:

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 ‘

3

Решение

Вывод аргумента шаблона основан на прямом сопоставлении типов между фактическим аргументом и формальным аргументом. Фактическим аргументом является список инициализатора. Это не соответствует 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), но трудно сказать, что подойдет для вашей нераскрытой цели.

2

Другие решения

Для выведения 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));
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector