是否可以稍后使用分配器构造std :: tuple的元素?

时间:2013-12-23 22:40:09

标签: c++ c++11 allocator stdtuple

据我所知,将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 个答案:

答案 0 :(得分:1)

分配器不会帮助您初始化对象:分配器的作用是提供原始,即未初始化的内存。分配器可与std::tuple<...>一起使用,以自定义例如std::stringstd::vector<...>的内存分配方式。

如果你想延迟对象的构造,你需要使用像“可选”对象这样的东西,它会用旗子表示它还没有被构造。相应类的实现策略将是适当的union

的包装器