【问题标题】:Create array/vector of items with different constructor arguments per item为每个项目创建具有不同构造函数参数的项目数组/向量
【发布时间】:2020-09-06 07:48:41
【问题描述】:

我想创建一个类实例的数组/向量(与哪一个无关)。我有以下限制:

  1. 每个实例都使用不同的参数构造(例如,Item(0)Item(1)Item(2)、...)。
  2. Item 类已删除其复制和移动构造函数。

上面的约束 #2 似乎排除了使用 std::vector 的可能性,因为向量在调整其后备存储的大小时需要复制或移动入队的实例。

这给我留下了一个数组。对于 C 样式数组和 std::array,似乎没有任何方法可以为数组中的项目指定自定义构造函数,因此我无法在数组索引中就地自定义构造项目。唯一的其他选择是创建一个指针数组并执行array[0] = new Object(0);array[1] = new Object(1);array[2] = new Object(2);,但这很麻烦,因为它在堆上分配内存而不仅仅是在堆栈上,并且需要我显式释放内存。

有没有办法做到这一点?

【问题讨论】:

  • 只是为了澄清:你想要的是将数组中对象的索引传递给它的构造函数?
  • 容器创建后是否需要调整大小?
  • @Kein 这恰好是真的,但我也想知道如果不是这种情况该怎么做。
  • @bolov 不,我预先知道尺寸。

标签: c++


【解决方案1】:

给定

struct Item
{
    Item(int);
    Item(const Item&) = delete;
    Item(Item&&) = delete;
};

你有一些选择:

智能指针

您可以使用智能指针,在本例中为std::unique_ptr

auto test()
{
    std::vector<std::unique_ptr<Item>> v;

    v.emplace_back(std::make_unique<Item>(1));
    v.emplace_back(std::make_unique<Item>(2));
    v.emplace_back(std::make_unique<Item>(3));
}

std::array

如果您不需要调整容器大小或移动容器,您可以使用std::array(C++17 起):

auto test2()
{
    std::array<Item, 3> arr{1, 2, 3};
}

由于新的临时实现规则,这从 C++17 开始有效。

【讨论】:

  • 哇,使用临时物化来做这件事看起来很棒!据我所知,我们可以用 C 数组来做到这一点吗?
  • 另外,当我在编译时不知道参数值(上面的1、2、3)时,有没有办法做到这一点?
  • @JackHumphries: auto test3(int a, int b, int c) { std::array&lt;Item, 3&gt; arr{a, b, c}; } 很好。
  • 看起来stackoverflow.com/questions/3763846/… 在这里也很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多