Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一次性使用类成语?_C++_Class_Design Patterns_Idioms - Fatal编程技术网

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_对象的析构函数中。我将更新帖子以反映这一点。