首页 > 解决方案 > 使用 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;
};

问题

假设我们试图插入一个已经存在于向量中的对象。由于我们使用的是工厂并且如果对象已经存在,我们只想检索它。包含移动语义的架构如何保证这种行为?

标签: c++movefactoryunique-ptr

解决方案


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

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

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


推荐阅读