Boost Circular Buffer, как заставить его вызывать какую-то функцию при заполнении? - PullRequest
1 голос
/ 19 августа 2011

Мне нравится Boost Tempulated Circular Buffer Container , но как получить, когда он был заполнен на 100%?

   #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 и, например, просмотреть все содержимое буфера?

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Вы можете обернуть экземпляр 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 , использовать Boost.Function или использовать какой-то другой механизм обратного вызова.

1 голос
/ 19 августа 2011

Это не вызывает событие.Вы должны вручную проверять, заполнен ли он каждый раз, когда вы добавляете к нему, и если это так, то вы выполняете какой-то процесс.

Обычно это делается путем помещения контейнера в созданный пользователем объекттак что вы можете отслеживать добавления в буфер.

Или, иначе говоря, вам не нужно универсальное решение;просто напишите объект, который использует контейнер и автоматически очищает его.

...