Инициализировать std :: array с подразумеваемой длиной [duplicate]

0

В C вы можете сделать int a[] = {1,2,3,4,5}, но С++ 11 std::array<int> a = {1,2,3,4,5} даст "Слишком мало параметров шаблона" компилирует ошибку. Как это обойти?

Теги:
arrays
c++11
stdarray

2 ответа

5
Лучший ответ

Самое лучшее, что вы можете сделать, это make_array, что-то вроде:

template<typename T, typename...Ts>
constexpr std::array<T, 1 + sizeof...(Ts)> make_array(T&& head, Ts&&...tail)
{
     return {{ std::forward<T>(head), std::forward<Ts>(tail)... }};
}
  • 0
    Почему это 1 + sizeof...(Ts) ? Для чего нужно дополнительное место?
  • 0
    @ 0x499602D2: 1 для первого параметра T head (мы выводим тип из head ).
-4

Реализация std :: array:

template<typename T, std::size_t N>
struct array {
    T array_impl[N];
};

Так что это должно работать:

std::array<std::int, 5> a = {{ 1, 2, 3, 4, 5 }};

который по сути аналогичен (поскольку компилятор согласился сбрасывать внутренние фигурные скобки.

std::array<std::int, 5> a = { 1, 2, 3, 4, 5 };

Видеть

  • 1
    Так как же вы можете сделать это, не говоря, что длина массива равна 5?
  • 0
    Вы указываете массив Rikayan, посмотрите на второй параметр шаблона, который передается в шаблон.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню