Как правильно "разместить новый" массив структур / классов с универсальной переменной-членом? - PullRequest
4 голосов
/ 06 июня 2019

Дан следующий класс:

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?

Я использую выровненное хранилище, чтобы предотвратить построение по умолчанию.

Теперь, что касается последнего вопроса, я понимаю, что этот вопрос может быть основан на мнениях, но я все еще надеюсь, что смогу получить какой-то ответ.

Было бы лучше просто сохранить второй массив, содержащий идентификатор, а не пытаться объединить их?

1 Ответ

2 голосов
/ 06 июня 2019

Ваш data является массивом, а сами Element правильно инициализированы.Это actual_data, что вы должны использовать новое размещение.

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

Тем не менее, почему вы поддерживаете id в элементе?Об этом уже позаботятся std::array.

...