我遇到了以下工厂代码。
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;
};
假设我们试图插入向量中已经存在的对象。由于我们使用的是工厂和 IF 对象已经存在,因此我们只想检索它。包含移动语义的体系结构将如何保证这种行为?
答案 0 :(得分:3)
解释此代码,在此工厂中,您的对象由getInstance
参数标识。该接口还建议调用者同时知道T
及其构造函数参数,以便他们可以自己构造T
。
该工厂的唯一用途是使每个对象成为单个对象。
您需要映射(args...) -> object
,而不是数组,因此首先您要使用args...
查找现有对象,并创建一个尚不存在的对象。
答案 1 :(得分:1)
您已经倒退std::unique_ptr<T>
的“唯一性”。没有一种神奇的机制可以使您在创建std::unique_ptr<T>
时以某种方式检查所有当前存在的std::unique_ptr<T>
并在拥有相同指针值的情况下执行不同的操作。
相反,假定您先前new
个T *
并从中构造了一个std::unique_ptr<T>
,或调用std::make_unique<T>
到new
一个{ {1}},然后将其包装在T
中。如果不是这种假设,并且unique_ptr<T>
被销毁,则程序的行为是不确定的。
然后禁止复制,向您保证std::unique_ptr<T>
被精确地调用一次 ,并且通常无需您付出额外的努力(即,指针的生命周期与指针的生命周期完全相同) )