2011-08-19 89 views
1

我喜歡Boost Templated Circular Buffer Container,但如何獲得100%的填充?Boost循環緩衝區,如何在填充時調用某些函數?

#include <boost/circular_buffer.hpp> 

    int main() { 

     // Create a circular buffer with a capacity for 3 integers. 
     boost::circular_buffer<int> cb(3); 

     // Insert some elements into the buffer. 
     cb.push_back(1); 
     cb.push_back(2); 
     cb.push_back(3); 

     // Here I want some function to be called (for example one that would cout all buffer contents) 

     int a = cb[0]; // a == 1 
     int b = cb[1]; // b == 2 
     int c = cb[2]; // c == 3 

     return 0; 
    } 

那麼如何來聽這樣的事件在boost::circular_buffer和例如COUT所有緩衝區的內容?

回答

3

您可以將circular_buffer實例包裝到它自己的類中,並在其上實現事件處理。

class MyCircularBuffer 
{ 
public: 
    MyCircularBuffer() : buffer(3) {} 

    void PushBack(int i) 
    { 
     buffer.push_back(i); 
     if(buffer.size() == 3) 
     { 
      // buffer is full! 
     } 
    } 
private: 
    boost::circular_buffer<int> buffer; 
}; 

如果外需MyCircularBuffer通知該事件的代碼,就可以實現Observer pattern的一些變種,使用Boost.Function或者使用一些其他的回調機制。

1

它不會觸發事件。每次添加它時都必須手動檢查它是否已滿,如果是,則執行一些過程。

這通常通過將容器包裝在用戶創建的對象中完成,以便您可以監視添加到緩衝區的內容。或者,換句話說,你不需要一個通用的解決方案;或者,換句話說,你不需要一個通用的解決方案。只需編寫一個使用容器的對象並自動刷新它。