Здравствуйте, pva, Вы писали:
pva>подскажите как бы вы решали такую задачу или может библиотеку, которая реализует что-то подобное:
pva>коллекция данных (list/vector) к которой необходимо обеспечить потокобезопасный доступ через "виды".
pva>Вобщем, некий аналог SQL View, когда поверх сырых данных обеспечивается фильтрованный доступ к содержимому коллекции.
pva>Помимо потокобезопасности хотелось бы возможность регистрировать колбек или другой механизм уведомления об изменении
Я бы сделал как
здесьАвтор: Kernan
Дата: 13.07.22
, только вместо std::mutex следует использовать
std::shared_mutex.
Должно получится что-то вроде:
template<typename T>
class SafeData
{
public:
template<class Fn>
auto Transform(Fn&& op) // запись
{
std::unique_lock lock( mtx );
return op(data);
}
private:
template<class Fn>
auto ConstAccess(Fn&& fnAccess) const
{
return fnAccess(data);
}
public:
template<class Fn>
auto Access(Fn&& fnAccess) // только чтение
{
static_assert( ! std::is_reference<decltype(fnAccess(data))>::value, "no references");
static_assert( ! std::is_pointer<decltype(fnAccess(data))>::value , "no pointers");
std::shared_lock lock( mtx );
return ConstAccess(std::forward<Fn>(fnAccess));
}
private:
std::shared_mutex mtx;
T data;
};
— осторожно, я это не тестировал и даже не компилировал. Просто эту задачу я бы решал примерно так.