gpt4 book ai didi

c++ - "placement new"具有通用成员变量的结构/类数组的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:33 24 4
gpt4 key购买 nike

给定以下类:

template<class T, std::size_t N>
class Example {
struct Element {
std::size_t id;
std::aligned_storage_t<sizeof(T), alignof(T)> actual_data;
};
std::array<Element, N> data;

public:
template<typename ...Args>
void emplace_insert(Args&&... args) {
auto some_id = 123; //for example

//placment new
new (&data[some_id]) Element(some_id, T(std::forward<Args>(args)...));
}
};

我将如何在 emplace_insert 函数中使用 placement new on data?我是否需要为 Element 结构定义自定义构造函数?如果需要,我将如何为 aligned_storage_t 传递参数?

我正在使用对齐存储来防止默认构造。

现在是最后一个问题,我意识到这个问题可能更多地基于意见,但我仍然希望我能得到某种答案。

只维护包含 id 的第二个数组而不是尝试将两者结合起来会更好吗?

最佳答案

您的data 是一个数组,Element 本身已正确初始化。您应该在 actual_data 上使用 placement new。

data[some_id].id = some_id;
new (&data[some_id].actual_data) T(std::forward<Args>(args)...);

也就是说,为什么要在元素中维护id?它已由 std::array 处理。

关于c++ - "placement new"具有通用成员变量的结构/类数组的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56472289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com