Можно ли добавить собственный конструктор для типа std::array?

Я попытался добавить свой собственный конструктор для типа std::array, но я не уверен, что это возможно и как это сделать...

Я пробовал что-то вроде этого:

typedef unsigned char byte_t;

namespace std {
  template<std::size_t _Nm>
  array::array(std::vector<byte_t> data)
  {
    // Some content
  }
}

Я хочу создать очень простой механизм преобразования std::vector<byte_t> в std::array<byte_t, size>.

  1. Это возможно?
  2. Как я могу это сделать?

Я использую С++ 14 (и я не могу использовать в своем проекте более новые стандарты)


person BartekPL    schedule 19.07.2018    source источник
comment
Просто к вашему сведению, добавление вещей в пространство имен std обычно является UB.   -  person user202729    schedule 19.07.2018
comment
@user202729 user202729 Это всегда UB? Даже если бы я попытался адаптировать стандартный контейнер данных для своих собственных определенных типов?   -  person BartekPL    schedule 19.07.2018
comment
stackoverflow.com/questions/41062294/   -  person user202729    schedule 19.07.2018
comment
Было бы проще написать функцию типа make_array, которая возвращает массив и принимает вектор в качестве аргумента.   -  person M.M    schedule 19.07.2018
comment
Существует очень ограниченное количество случаев, когда разрешено добавление кода в namespace std. Это не имеет значения, потому что вы не можете добавить конструктор в класс, которым вы не владеете, в namespace std или нет. FYI std::array не имеет конструкторов по дизайну.   -  person n. 1.8e9-where's-my-share m.    schedule 19.07.2018
comment
нет такой вещи, как иногда UB. УБ = УБ. Это немного странно, чего вы пытаетесь достичь. std::array создается во время компиляции, а vector создается во время выполнения (и не имеет конструктора constexpr). У меня такое чувство, что под вашим вопросом есть еще одна проблема.   -  person UmNyobe    schedule 19.07.2018
comment
Я только пытаюсь добиться очень простого преобразования вектора в массив. Так же просто, как char c = 10. Если я не могу добавить конструктор, я хотел бы добавить operator=.   -  person BartekPL    schedule 19.07.2018
comment
Вы также не можете добавить operator=, потому что он особенный, но вы можете добавить какой-нибудь другой оператор, например << (в вашем собственном пространстве имен).   -  person n. 1.8e9-where's-my-share m.    schedule 19.07.2018
comment
почему ты хочешь сделать это? Что для вас не так с std::vector?   -  person Daniel Langr    schedule 19.07.2018
comment
@DanielLangr То, что вы сказали, частично верно. На самом деле это возможно, как это представляет Максим Егорушкин. Мне нужен контейнер фиксированного размера.   -  person BartekPL    schedule 19.07.2018


Ответы (2)


Конструкторы — это специальные функции-члены, они должны быть объявлены в определении класса. Невозможно добавить конструкторы в существующий класс без изменения определения класса.

Вы можете добиться аналогичного эффекта, используя фабричную функцию:

template<size_t N, class T>
std::array<T, N> as_array(std::vector<T> const& v) {
    std::array<T, N> a = {};
    std::copy_n(v.begin(), std::min(N, v.size()), a.begin());
    return a;
}

int main() {
    std::vector<byte_t> v;
    auto a = as_array<10>(v);
}
person Maxim Egorushkin    schedule 19.07.2018
comment
Не говоря уже о том, что размер vector известен во время выполнения, но array должен быть известен во время компиляции... - person ildjarn; 19.07.2018
comment
@ildjarn Я знаю это, и у меня есть решение для этого - person BartekPL; 19.07.2018

Я сомневаюсь в необходимости такого преобразования, за исключением функции, которая ожидает std::array и не может быть изменена. У вас есть две альтернативы:

  1. Используйте старый добрый необработанный массив T* под вектором. В конце концов, std::array предназначен для простого управления эквивалентом массива C фиксированного размера.
  2. Сделайте так, чтобы ваш код не знал о контейнерах, используя функции на итераторах. Это путь проектирования, который ожидает современный С++. Вы можете взглянуть на возможную реализацию различных операций в библиотеке алгоритмов.
person UmNyobe    schedule 19.07.2018