Вы можете «узнать» размер массива автоматически:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
Надеюсь, вы можете изменить интерфейс на set_data, как указано выше. Он по-прежнему принимает массив в стиле C в качестве первого аргумента. Это просто происходит, чтобы взять его по ссылке.
Как это устроено
[Обновление: см. Здесь для более всестороннего обсуждения изучения размера]
Вот более общее решение:
template<typename T, size_t N>
void copy_from_array(vector<T> &target_vector, const T (&source_array)[N]) {
target_vector.assign(source_array, source_array+N);
}
Это работает, потому что массив передается как ссылка на массив. В C / C ++ вы не можете передать массив как функцию, вместо этого он распадется на указатель, и вы потеряете размер. Но в C ++ вы можете передать ссылку на массив.
Передача массива по ссылке требует, чтобы типы точно совпадали. Размер массива является частью его типа. Это означает, что мы можем использовать параметр шаблона N, чтобы узнать размер для нас.
Возможно, было бы еще проще иметь эту функцию, которая возвращает вектор. При соответствующей оптимизации компилятора это должно быть быстрее, чем кажется.
template<typename T, size_t N>
vector<T> convert_array_to_vector(const T (&source_array)[N]) {
return vector<T>(source_array, source_array+N);
}