有些时候,您希望对某些数据执行逻辑,并且每个数据实例只执行一次。据我所知,没有这样的模式(更不用说成语)来完成这个。
有std::call_once()
但只能确保每个流程实例执行一次。即使std::once_flag
可以用作类数据成员,它也只是确保函数只在运行时调用一次,而不是在编译时尝试强制执行它。
输入一次性使用类:
class single_use_key {
public:
single_use_key() : _self(new model_t()) {}
private:
struct model_t {
// Data you want used once and only once
};
std::unique_ptr<const model_t> _self;
};
class consumer_object {
public:
consumer_object(single_use_key key) : _self(std::make_shared<const model_t>(std::move(key))) {}
private:
struct model_t {
model_t(single_use_key key) : _key(std::move(key)) {}
~model_t() {
// Logic you want executed only once for the data
}
single_use_key _key;
};
std::shared_ptr<const model_t> _self;
};
single_use_key key;
consumer_object consumer(key); // Error
consumer_object consumer(std::move(key)); // OK
这个习惯用法确保类实例只使用一次,因为它只能移动而不能被复制。
如果您想多次尝试使用该对象,则必须在承诺之后不必引用它(因为std::move()
被调用)。即使您这样做,也可以将消费者类/功能设置为忽略它,就像std::call_once()
的做法一样,因为std::unique_ptr<>
之后保证std::move()
无效。
你觉得这个成语有什么问题吗?有没有这样的东西,我还没有找到呢? (或许我说的是一些如此明显的东西,没有人费心去记录它......)