boost — техника C ++ / библиотека для объединения контейнера и пользовательской логики?

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

Естественное решение — создать отдельный поток, ожидающий такие объекты. Когда объект становится доступным, этот второй поток задерживается по мере необходимости и обрабатывает объект. Второй поток будет спать на семафор. Когда основной поток имеет объект для отложенной обработки, он помещает объект в очередь и сигнализирует семафор.

Хотя это будет работать, есть риск, что другой программист (или я) может забыть сигнализировать семафор при постановке в очередь объекта; Я хочу, чтобы это было навязано.

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

Но эта функциональность кажется настолько полезной и столь желанной, что я готов поспорить, что кто-то уже написал это, возможно, с лучшим дизайном, чем я предлагаю здесь, и обратился к волосатым деталям, таким как повторное появление. Существует ли библиотека для этого? Или есть хорошо известная методика получения этой функциональности?

1

Решение

Я использовал частное наследство для этого, наряду с using декларации:

struct myVec : private std::vector<int> {
// Stuff that works the same
using std::vector<int>::push_back;
using std::vector<int>::erase;
using std::vector<int>::iterator;

// Stuff that works differently:
void erase(std::vector<int>::iterator it) { ... }
};

Важно не использовать публичное наследование от стандартных контейнеров. Вы будут в конечном итоге писать ошибки, связанные с нарезкой и не виртуальные деструкторы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]