Вы можете «узнать» размер массива автоматически:
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);
}