Возможность построить элементы 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,

Другие вопросы по тегам