Std::array - Как я могу создать член класса фиксированного размера для объекта, который не может быть построен по умолчаC++

Программы на C++. Форум разработчиков
Anonymous
Std::array - Как я могу создать член класса фиксированного размера для объекта, который не может быть построен по умолча

Сообщение Anonymous »

Я создаю класс-контейнер для любого типа T, который должен хранить список T, длина которого известна во время компиляции. Я изо всех сил пытаюсь найти структуру данных, которая могла бы хорошо решить эту проблему, как жалуется std::array, когда я пытаюсь инициализировать свой объект в теле моего конструктора. Крайне важно, что тип T не является конструктивным по умолчанию.
Вот фрагмент, который примерно соответствует той функциональности, которую я ищу

Код: Выделить всё

#include 
#include 
#include 

struct not_default_constructible
{
not_default_constructible(int){}
};

static_assert(!std::is_default_constructible_v);

/*
Does not compile!
*/

template
struct array_of_ndc
{
std::array arr;

array_of_ndc(T init)
{
for(size_t i = 0; i < N; i++)
{
arr[i] = init;
}
}
};

int main()
{
array_of_ndc ndc(not_default_constructible{2});
}
Проблема этого фрагмента (который не компилируется!) заключается в том, что компилятор хочет, чтобы я инициализировал свой std::array перед телом моего конструктора.
Вот одно решение, которое я написал, но такое ощущение, будто я борюсь с компилятором (и оно ломает все, что мне нравится в std::array, то есть итераторы) , и я хотел посмотреть, есть ли более подходящее для STL решение.

Код: Выделить всё

template
struct no_construction_arr
{
alignas(T) char data[N * sizeof(T)];

template
requires(std::constructible_from)
no_construction_arr(U&& init)
{
for(size_t i = 0; i < N; i++)
{
new (&data[i * sizeof(T)]) T (init);
}
}

T* operator[](size_t index)
{
return reinterpret_cast(&data[index * sizeof(T)]);
}

~no_construction_arr()
{
for(size_t i = 0; i < N; i++)
{
(reinterpret_cast(&data[i * sizeof(T)]))->~T();
}
}
};
Я также добавлю, что знаю, что могу сделать это с помощью std::vector. Речь идет о попытке воспользоваться тем фактом, что я заранее знаю размер списка, который мне понадобится, и поэтому кажется расточительным делать ненужное динамическое выделение.


Подробнее здесь: https://stackoverflow.com/questions/784 ... -that-cant

Вернуться в «C++»