Есть ли способ позволить "make_unique <T []>" передавать аргументы конструктору T? - PullRequest
0 голосов
/ 29 января 2019

У меня есть несколько объектов одного и того же класса в массиве, на который указывал unique_ptr, и каждый объект может быть создан только с помощью явного конструктора, поскольку несколько конструкторов должны быть переданы конструктору.

При инициализации я собираюсь создать такой unique_ptr следующим образом:

unique_ptr<ClassA [ ] >  arrayA = make_unique<ClassA [ ]>(100, some args to be passed );

Но похоже, что ни одна версия make_unique не может сделать это, как указано выше.Согласно документации: если make_unique создает массив, он принимает только один аргумент, равный размеру массива.

Я не могу использовать вектор в этих сценах, так как ClassA - это очередь сообщений, которая используется совместно.несколькими потоками (производителями / пользователями), а вектор переместит элементы на новое место, если места недостаточно.

Есть ли другой способ, в нем я могу сделать массив класса, который имеет только явный конструктор?В то же время я все еще хочу использовать unique_ptr для управления ими.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вам не нужно использовать make_unique, вы можете создать указатель и передать часть выделенной вручную памяти.

class ClassA {
 public:
  int a;
  float b;
};

const auto x = std::unique_ptr<ClassA[]>{new ClassA[2]{{1, 2}, {1, 2}}};
0 голосов
/ 29 января 2019

Я думаю, что идея, предложенная @AchimGuetlein, лучше.

Определите следующим образом:

vector<unique_ptr<ClassA> > container;

for (i = 0; i<number of queues; ++i)
    container.emplace_back(make_unique<ClassA>(args to constructor of ClassA));

вместо:

unique_ptr<ClassA [] > ques = make_unique<ClassA [] >(n, ...);

Хотя элементы вектора могутбыть перемещен, в моих очередях не было перемещения.Перемещенные объекты являются только unique_ptr self, но адреса очередей никогда не будут изменены.

Извините за фиксацию этого ответа, поскольку пример кода не может быть изящно показан как кодлет в комментарии.

...