使用可变模板列表初始化数组,并放置new

Initialize array using variadic template list and placement new

本文关键字:数组 new 初始化 列表      更新时间:2023-10-16

我正在尝试实现以下功能:

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<>为数组分配内存((呼叫。这应该已经很清楚了,但我要添加的是使用placementnew为分配的内存中的每个数组元素调用构造函数。正是在那里,我想善意地寻求帮助。。。

基本上,对于一个元素,我可以写:

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

这个想法是用ptr+n地址上的参数列表中的第n个参数初始化第n个元素,最好使用move构造函数来避免不必要的副本。

我希望你有这个想法。。。非常感谢您的帮助!

Martin

利用折叠表达式的机会。是的:(

您可以使用逗号运算符来重复操作,并使用计数器来增加索引:

std::ptrdiff_t i = 0;
(::new(ptr + i++) T(arguments), ...);

使用Fold表达式:

T* ptr = allocator.template allocate<sizeof...(ARGUMENTS)>();
T* p = ptr;
((::new (static_cast<void*>(p++) T(arguments)), ...);