一个元素大小的容器,当使用数据时,自动擦除,模式

时间:2016-03-18 13:36:04

标签: c++ design-patterns

我正在为下一个问题寻找模式或一些现成的解决方案:

  

具有功能的容器:

     
      
  1. 存储
  2. 的任意类型的一个元素   
  3. 从容器中取出元素时,它会变空
  4.   
  5. 存储新元素时,会覆盖以前的内容
  6.   
  7. 线程安全
  8.   

我没有线程安全的天真实现:

template<typename T>
class Boxed {
    T* _data;
public:
    Boxed()
        : _data(nullptr)
    {}

    Boxed(const T& data)
        : _data(new T(data))
    {}

    ~Boxed() {
        if(_data != nullptr) {
            delete _data;
        }
    }

    inline
    void setData(const T& data) {
        if(_data != nullptr) {
            delete _data;
        }
        _data = new T(data);
    }

    inline
    T getData() {
        T res(*_data);
        delete _data;
        _data = nullptr;
        return res;
    }

    inline
    bool empty() const {
        return _data == nullptr;
    }

    inline
    operator bool() cons {
        return empty();
    }
};

我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:1)

使用大小为2的队列。使用互斥锁保护下划线数组/向量/双端队列。推送和弹出的逻辑是微不足道的。在推送时:如果不为空,则删除旧元素,插入新元素。在弹出:它是空的或大小为1,没有什么特别的事情比普通的流行音乐。因此它不会覆盖当前的但会替换它。差异是不可观察的。

签名:

class only_one
{
public:
    bool push(T& e);
    bool pop(T& e);
    bool is_empty() const;
}

使用互斥锁/ condition_var的线程安全队列的实现可以在互联网的许多角落找到。 Example