c++ - 使用 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;
};
问题
假设我们试图插入一个已经存在于向量中的对象。由于我们使用的是工厂并且如果对象已经存在,我们只想检索它。包含移动语义的架构如何保证这种行为?
解决方案
解释此代码,在此工厂中,您的对象由getInstance
参数标识。该接口还建议调用者知道两者T
及其构造函数参数,以便他们可以构造T
自己。
这个工厂的唯一用途是使每个对象成为单例。
您需要一个映射(args...) -> object
,而不是一个数组,以便首先使用现有对象查找现有对象args...
,如果该对象尚不存在则创建该对象。
推荐阅读
- wget - 如何将 bin 安装到特定文件夹?
- robotframework - 如何在运行时增加第 n 个子值?
- python - HTTPERROR 400 删除消息标签 gmail api python
- java - 如何增加 Vaadin 11.0.0 网格中的行高?
- php - 无法使用 gettext 检索 .mo 文件中的翻译字符串
- c# - 日期时间格式以编程方式 WPF Datagrid
- android - AMD 处理器上的 Android Studio 硬件加速
- android - 改造 - 404 Not Found web api .net
- java - Java simpledateformat.parse 给出的年份不正确
- java - SpringBoot 不会更改语言环境,但是当我设置 -Duser.language=en 时,它可以工作