c++ - 使用 unique_ptr 保证工厂中的唯一对象

标签 c++ move factory unique-ptr

我遇到了以下工厂代码。

  • T::create(std::forward<Args>(args)...)返回指向动态创建的对象的指针。所以基本上,如果两个对象具有相同的地址,那么它们就是相同的。
  • unique_ptr保证单个 unique_ptr容器拥有持有指针的所有权。这意味着您无法复制 unique_ptr。

#pragma once

#include <memory>
#include <vector>

template <typename T>
class PoolFactory {
 public:
  template <typename... Args>
  T *getInstance(Args... args) {
    _createdItems.push_back(
        std::unique_ptr<T>(T::create(std::forward<Args>(args)...)));
    return _createdItems.back().get();
  }
  ~PoolFactory() = default;

 public:
  std::vector<std::unique_ptr<T>> _createdItems;
};

问题

假设我们试图插入一个已经存在于 vector 中的对象。由于我们正在使用工厂并且 IF 对象已经存在,我们只想检索它。包含 move 语义的架构将如何保证该行为?

最佳答案

解释此代码,在此工厂中,您的对象由 getInstance 参数标识。该接口(interface)还建议调用者知道 T 及其构造函数参数,以便他们可以自己构造 T

此工厂的唯一用途是使每个对象成为单例。

您需要一个映射 (args...) -> object,而不是一个数组,这样您首先可以使用 args... 查找现有对象并创建该对象(如果它尚不存在)。

关于c++ - 使用 unique_ptr 保证工厂中的唯一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53044802/

相关文章:

c++ - 返回的 cpu 时钟时间必须在运行中完全相同吗?

c++ - MFC 中的窗口角坐标

c++ - 返回类型扣: What method is preferred?

c++ - 是什么让 move 对象比复制更快?

c++ - RAII 和工厂设计模式?

php - 如何在 Laravel 8 中运行特定工厂

c++ - C++方法来重定位隐式不可 move 类的对象

jquery - Fullcalendar - 如何立即将 ID(来自数据库)放入事件中?

ios - 触摸 move UILabel 一直有效,直到值修复 - 错误还是功能?

caSTLe-windsor - 温莎城堡 : A better way to implement 2 levels of (nested) factories?