C++ “正确的方法是什么?”;“新安置”;具有泛型成员变量的结构/类数组?

C++ “正确的方法是什么?”;“新安置”;具有泛型成员变量的结构/类数组?,c++,placement-new,C++,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&l

鉴于以下类别:

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)...));
    }
};
模板
课例{
结构元素{
std::大小\u t id;
std::对齐的存储与实际数据;
};
std::数组数据;
公众:
模板
无效模板插入(参数和…参数){
autosome_id=123;//例如
//安抚新
新的(&data[some_id])元素(some_id,T(std::forward(args)…);
}
};
如何在
emplace\u insert
函数中使用新数据的位置?我是否需要为
元素
结构定义自定义构造函数,如果需要,我将如何为
对齐存储
传递参数

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

最后一个问题,我意识到这一个可能更基于观点,但我仍然希望我能得到一些答案


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

您的
数据
是一个数组,并且
元素本身已正确初始化。您应该在新位置上使用的是
实际\u数据

data[some_id].id = some_id;
new (&data[some_id].actual_data) T(std::forward<Args>(args)...);
data[some\u id].id=some\u id;
新(&data[some_id]。实际_数据)T(std::forward(args)…);

也就是说,为什么要在元素中维护
id
?它已经被
std::array

处理了,你不就做
data[some\u id].id=some\u id;新(&data[some_id]。实际_数据)T(std::forward(args)…)?@melpomene现在我想起来,这是有意义的,因为元素数组毕竟是默认构造的。在这种情况下,我正在创建的数据结构需要能够从元素中找到元素的索引,我不确定是否还有其他方法可以做that@HexCrown好啊这只是一个旁注,不要当真。为了进一步澄清,insert方法将返回一个id,该id将不是真正的元素id,而是检查实际索引的查找数组的id。我将要做的是在内部洗牌元素,同时允许外部的索引保持不变。