【问题标题】:What is the proper way to "placement new" an array of structs/classes with a generic member variable?使用通用成员变量“放置新”结构/类数组的正确方法是什么?
【发布时间】:2019-06-06 06:55:35
【问题描述】:

给定以下类:

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[some_id].id = some_id; new (&amp;data[some_id].actual_data) T(std::forward&lt;Args&gt;(args)...);吗?
  • @melpomene 现在我想起来了,这确实有道理,因为 Elements 数组毕竟是默认构造的。

标签: c++ placement-new


【解决方案1】:

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

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

也就是说,为什么要在元素中保留idstd::array 已经处理好了。

【讨论】:

  • 在这种情况下,我正在制作的数据结构需要能够从元素中找到元素的索引,我不确定还有其他方法可以做到这一点跨度>
  • @HexCrown 好的。这只是一个旁注,不要当真。
  • 为了更清楚地说明,插入方法将返回一个 id,该 id 不会是真正的元素 id,而是一个查找数组的 id,它将检查真正的索引。我要做的是在内部改组元素,同时允许来自外部的恒定索引。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2014-05-05
  • 2019-03-02
  • 2021-08-16
相关资源
最近更新 更多