使用iota初始化unique_ptr的容器

托维

要了解C ++ 11的复杂性,我正在玩unique_ptr一些。

我想知道,有什么方法可以iota用来初始化的容器unique_ptr吗?

我首先使用了独特的无ptr的解决方案,该解决方案运行良好:

std::vector<int> nums(98); // 98 x 0
std::iota(begin(nums), end(alleZahlen), 3); // 3..100

现在,尽我们所能使用它 unique_ptr

std::vector<std::unique_ptr<int>> nums(98); // 98 x nullptr
std::unique_ptr three{ new int{3} };
std::iota(begin(nums), end(nums), std::move{three});

这显然失败了。原因:

  • 虽然我标记threemove作为&&这可能不足以复制/移动的初始值到容器中。
  • ++initValue也将不起作用,因为initValue它的类型是unique_ptr<int>,并且没有operator++定义。但是:我们可以定义一个自由函数unique_ptr<int> operator++(const unique_ptr<int>&);,至少可以解决这个问题。
  • 但是再次不允许从该操作中复制/移动结果unique_ptr,这一次,我看不到如何欺骗编译器使用move

好吧,那是我停下来的地方。而且我想知道我是否想念一些关于如何告诉编译器他可能会move产生结果的有趣想法operator++还是还有其他障碍?

伊戈尔垃圾

为了以98个实例结束unique_ptr,必须有98个对的调用new您尝试只逃脱一种-不可能飞翔。

如果您真的有意将方钉砸入一个圆孔中,则可以执行以下操作

#include <algorithm>
#include <iostream>
#include <memory>
#include <vector>

class MakeIntPtr {
public:
  explicit MakeIntPtr(int v) : value_(v) {}
  operator std::unique_ptr<int>() {
    return std::unique_ptr<int>(new int(value_));
  }
  MakeIntPtr& operator++() { ++value_; return *this; }
private:
  int value_;
};

int main() {
  std::vector<std::unique_ptr<int>> nums(98);
  std::iota(begin(nums), end(nums), MakeIntPtr(3));

  std::cout << *nums[0] << ' ' << *nums[1] << ' ' << *nums[2];
  return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用初始化列表初始化unique_ptr的容器,继续

您可以从初始化列表中使用unique_ptr初始化STL容器吗?

使用初始化列表的vector <unique_ptr <A>>

无法使用std :: unique_ptr初始化指针

如何初始化unique_ptr

无法在类中初始化unique_ptr的向量

C ++ 11中的unique_ptr的延迟初始化

unique_ptr <>()初始化会失败吗?

C++ unique_ptr 初始化

成员初始化列表中的unique_ptr

延迟初始化std :: unique_ptr

C++:unique_ptr 未正确初始化

在類內部初始化 unique_ptr

如何初始化std :: unique_ptr <std :: unique_ptr <T> []>?

在构造函数中使用C ++中的unique_ptr初始化向量

使用本地原始指针初始化std :: unique_ptr时会发生什么?

如何使用空指针初始化unique_ptr的向量?

使用unique_ptr作为值初始化静态std :: map

在C ++ 11中使用initializer_list初始化unique_ptr

使用unique_ptr作为值初始化const静态std :: map

vector<unique_ptr<Base> > 使用 Derived 的初始化列表

初始化std :: unique_ptr作为原始数组指针的初始化

在 GCC 5.4 中使用初始化列表和 make_unique 创建 unique_ptr 列表失败

从unique_ptr <T []>初始化shared_ptr <T>

使用静态const初始化unique_ptr时出现未定义的参考错误

是否可以在构造函数的初始化程序列表中初始化std :: unique_ptr的std :: array?

如何从原始C堆内存指针初始化unique_ptr?

我是否需要在构造函数中显式初始化std :: unique_ptr?

从本地原始指针初始化 std::unique_ptr 是否安全?