Инициализируйте массив, используя список шаблонов с переменным номером и разместив новый - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь реализовать следующую функцию:

template<typename T, typename... ARGUMENTS>
std::unique_ptr<T[], HeapDeleter<T[]>> allocate_array( ARGUMENTS&&... arguments ) {
HeapAllocator<T> allocator;

/* Allocate array which size is equal to number of arguments given */
T* ptr = allocator.template allocate<sizeof...(ARGUMENTS)>();
if( ptr != nullptr ) {
/* TODO: There comes the magic... */
}

Первый шаг - выделить память для массива с помощью вызова allocate <> (). Это уже должно быть понятно, но я собираюсь добавить конструктор для каждого элемента массива в выделенной памяти, используя новое размещение. Там точно я хотел бы просить помощи ...

В основном для одного элемента я могу написать:

::new( static_cast<void*>( ptr ) T( /* One argument from arguments given */ );

Идея состоит в том, чтобы инициализировать n-й элемент с n-йаргумент в списке аргументов по адресу ptr + n, в идеале, с помощью конструктора перемещения, чтобы избежать ненужных копий.

Надеюсь, у вас есть идея ... Заранее большое спасибо за помощь!

Мартин

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Возможность использовать выражения сгиба. Yay:)

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

std::ptrdiff_t i = 0;
(::new(ptr + i++) T(arguments), ...);
2 голосов
/ 24 октября 2019

с выражением Fold:

T* ptr = allocator.template allocate<sizeof...(ARGUMENTS)>();
T* p = ptr;

((::new (static_cast<void*>(p++) T(arguments)), ...);
...