C++ 一次性使用类成语?
有时,您希望对某些数据执行一次逻辑,并且每个数据实例只执行一次逻辑。据我所知,实现这一目标没有这样的模式(更不用说成语了) 有C++ 一次性使用类成语?,c++,class,design-patterns,idioms,C++,Class,Design Patterns,Idioms,有时,您希望对某些数据执行一次逻辑,并且每个数据实例只执行一次逻辑。据我所知,实现这一目标没有这样的模式(更不用说成语了) 有std::call_once(),但它只确保每个流程实例执行一次。即使std::once_标志可用作类数据成员,也只需确保函数在运行时只调用一次,而不是在编译时强制执行 输入一次性使用类别: class single_use_key { public: single_use_key() : _self(new model_t()) {} private: stru
std::call_once()
,但它只确保每个流程实例执行一次。即使std::once_标志
可用作类数据成员,也只需确保函数在运行时只调用一次,而不是在编译时强制执行
输入一次性使用类别:
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
类单个\u使用\u键{
公众:
单次使用密钥():\u self(新模型\u t()){}
私人:
结构模型{
//您希望使用一次且仅使用一次的数据
};
std::唯一的ptr自身;
};
类消费者对象{
公众:
消费者对象(单次使用密钥):\u self(std::make_shared(std::move(key))){
私人:
结构模型{
model_t(单用键):_键(std::move(键)){
~model_t(){
//您只希望对数据执行一次的逻辑
}
单键使用键;
};
std::共享的ptr自身;
};
单键使用;
使用者_对象使用者(键);//错误
使用者\对象使用者(标准::移动(键));//好啊
这个习惯用法确保类实例只使用一次,因为它只能移动,不能复制
如果您想多次尝试使用该对象,您必须在承诺不使用该对象后引用它(因为调用了std::move()
)。即使您这样做了,消费者类/函数也可以设置为忽略它,就像std::call_once()
那样,因为std::unique_ptr
保证在std::move()
之后为null
你觉得这个成语有什么问题吗?难道我还没有找到这样的东西吗?(或者也许我说的是一件很明显的事情,从来没有人费心去记录它……这似乎是一种相当复杂的方式来总结
std::unique_ptr
,因为这是确保一次性使用的有效方法。为什么不直接使用std::unique_ptr
设计界面?@paddy我喜欢确保值语义,而不必检查std::unique_ptr是否为空。包装std::unique_ptr
还可以实现数据隐藏,并允许添加允许多次调用的朋友或成员函数。我很抱歉我不知道这是如何确保“某些数据上的逻辑”执行一次的。你指的是什么“逻辑”?这似乎确保了某些数据是不可复制的,而另一些则是不可复制的。@ChrisDrew在消费者对象的设计中可以通过多种方式实现。我通过RAII执行,并将逻辑放入consumer_对象的析构函数中。我将更新帖子以反映这一点。