Полагаю, вам может понадобиться использовать эту функцию поиска не один раз. Итак, согласно DRY, вам нужно отделить блок, в котором вы вызываете алгоритм std :: find_if, от отдельной функции-оболочки.
{
// ... function beginning
auto found = std::find_if(m_programs.cbegin(), m_programs.cend(),
[&](const auto& prog)
{
bool b = prog->compare(...);
if (b)
TraceInfo(...);
return b;
});
if (found == m_programs.cend())
return nullptr;
return *found;
}
Предложение хорошее. Алгоритм STL позволяет выбрать подходящий подход в зависимости от типа вашего контейнера.
Кроме того, я предлагаю вам использовать самобалансирующийся контейнер, такой как std :: set.
// I don't know what kind of a pointer you use.
using pProgType = std::shared_pointer<ProgType>;
bool compare_progs(const pProgType &a, const pProgType &b)
{
return std::less(*a, *b);
}
std::set<std::shared_pointer<prog_type>,
std::integral_constant<decltype(&compare_progs), &compare_progs>> progs.
Это отсортированный контейнер, поэтому вы будете тратить меньше времени на поиск программы по значению, если вы реализуете оператор сравнения (который вызывается std :: less).
Если вы можете использовать stlфункция, используйте это. Таким образом, вам не нужно будет помнить то, что вы изобрели, потому что stl правильно задокументирован и безопасен в использовании.