使用泛型成员变量"placement new"结构/类数组的正确方法是什么?



给定以下类:

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函数中使用新数据放置?我是否需要为 Element 结构定义一个自定义构造函数,如果是这样,我将如何传递aligned_storage_t的参数?

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

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

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

您的data是一个数组,并且Element本身已正确初始化。actual_data您应该使用放置新打开。

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

也就是说,为什么要在元素中保持id?它已经由std::array照顾.

最新更新