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

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


person jcai    schedule 27.02.2014    source источник


Ответы (2)


Лучшее, что у вас может быть, это 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)... }};
}
person Jarod42    schedule 27.02.2014
comment
Почему 1 + sizeof...(Ts)? Для чего дополнительное место? - person 0x499602D2; 27.02.2014
comment
@ 0x499602D2: 1 для первого параметра T head (мы выводим тип из head). - person Jarod42; 27.02.2014

Реализация 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 };

Видеть

person Dory Zidon    schedule 27.02.2014
comment
Итак, как вы можете сделать это, не говоря, что длина массива равна 5? - person Rikayan Bandyopadhyay; 27.02.2014
comment
вы указываете массив Rikayan, посмотрите на второй параметр шаблона, который передается в шаблон.. - person Dory Zidon; 27.02.2014
comment
@DoryZidon Это не отвечает на то, что он спрашивает. - person Zac Howland; 27.02.2014