Есть несколько способов решения этой проблемы.Один из способов - использовать более сложную структуру для хранения вашей истории, например, неизменный вектор.(Неизменяемый вектор торгует производительностью итерации для дешевых копий.) Но, используя только стандартный C ++, я думаю, что самый простой способ - добавить шаблон функции-члена обхода к классу A, который принимает обратный вызов:
template <class F> void TraverseHistory(F&& callback)
{
std::lock_guard guard{ historyMutex };
for (auto const& item : history)
{
callback(item);
}
}
Вы можететакже используйте std::function
, если вы предпочитаете избегать шаблона функции:
void TraverseHistory(std::function<void(MyObject const&)> const& callback);
Еще один вариант - передать ссылку на весь вектор в ваш обратный вызов.При таком подходе шаблон функции будет выглядеть примерно так:
template <class F> void ReadHistory(F&& callback)
{
std::lock_guard guard{ historyMutex };
callback(std::as_const(history));
}