使用可变模板列表初始化数组,并放置new
Initialize array using variadic template list and placement new
我正在尝试实现以下功能:
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)), ...);
相关文章:
- 在类c++中使用new声明数组
- 在将 new 与指针一起使用时,创建数组的指定长度
- 声明C++数组(带或不带 "new" 关键字)
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 使用new创建数组而不声明大小
- 正确分配放置 new 的数组
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 使用new时如何重新分配dyyanmic数组,不使用realloc删除C++?
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 使用可变模板列表初始化数组,并放置new
- 如何获取由 new 创建的数组的开始和结束
- 使用 "new" 命令在 C++ 中的类构造函数中分配 2D 数组
- 构造函数不会将使用 new 初始化的数组作为参数
- 将指针返回使用New创建的数组数组
- 使用泛型成员变量"placement new"结构/类数组的正确方法是什么?
- 将内存分配给 2D 数组时,“new int*[rowCount];”的含义是什么?是 2D 数组,是指向数组的指针数组
- 使用 Marshal.FreeHGlobal() 来释放以前在本地分配了"new"的数组?
- 向量在我的类中.错误:数组new [-fpermissive]中的圆括号初始化项
- 新增[size]对象(args ..)在数组new [-fpermissive]中添加圆括号初始化器
- 错误:数组new中的size必须是整型[-fpermissive]