Возможность построить элементы std::tuple позже с помощью распределителя?
Насколько я понял, одной из причин использования распределителей C++ для моего собственного контейнера было бы то, что я могу разделять распределение и конструирование.
Теперь мне интересно, возможно ли это для std:: tuples следующим образом: Каждый раз, когда я создаю std:: tuple, пространство резервируется, но объекты не создаются (пока). Вместо этого я могу использовать распределитель, чтобы создать i-й аргумент именно тогда, когда я хочу.
Псевдо-код:
struct my_struct {
const bool b; // note that we can use const
my_struct(int x) : b(x==42) {}
};
int main()
{
std::tuple<int, my_struct> t;
// the tuple knows an allocator named my_allocator here
// this allocator will force the stack to reserve space for t,
// but the contained objects are not constructed yet.
my_allocator.construct(std::get<0>(t), 42);
// this line just constructed the first object, which was an int
my_allocator.construct(std::get<1>(t), std::get<0>(t));
// this line just constructed the 2nd object
// (with help of the 1st one
return 0;
}
Одна из возможных проблем заключается в том, что распределители обычно связаны с типом, поэтому мне потребуется один распределитель на тип. Другой вопрос заключается в том, должна ли память для std:: tuple выделяться в куче, или стек может работать. Оба в порядке для меня.
Тем не менее, возможно ли это как-то? Или если нет, то можно ли это сделать с помощью распределителя, который я пишу самостоятельно?
1 ответ
Распределители не помогут вам с инициализацией объектов: роль распределителя заключается в предоставлении необработанной, то есть неинициализированной памяти. Распределитель может быть использован с std::tuple<...>
настроить, например, память для std::string
или std::vector<...>
выделено.
Если вы хотите отложить создание объектов, вам нужно использовать что-то вроде "необязательного" объекта, который бы указывал флагом, что он еще не создан. Стратегия реализации для соответствующего класса будет оберткой вокруг подходящего union
,