Используя all_of с коллекцией лямбда-функций? - PullRequest
2 голосов
/ 19 апреля 2019

Как и в настоящее время, этот код работает и проверяет, что каждое значение соответствует всем фильтрам в FilterCollection, возможно ли использовать all_of (any_of, none_of и т. Д.) В таком сценарии, чтобы немного сжать эту функциюбольше?

template<typename T>
bool filter(const T& filters, int val)
{
    // Can use std::all_of() somehow?
    for (auto filter : filters)
    {
        if (!filter(val))
        {
            return false;
        }
    }
    return true;
}

int main()
{
    ////////////////////////////////////////
    using FilterContainer = std::vector<std::function<bool(int)>>;
    FilterContainer lxFilters;
    lxFilters.emplace_back([&](int val) { return val % 5 == 0; });
    lxFilters.emplace_back([&](int val) { return val >= 10; });
    lxFilters.emplace_back([&](int val) { return val <= 100; });

    using FilterResults = std::vector<bool>;
    FilterResults filteredValues;
    filteredValues.push_back(filter(lxFilters, 5)); // False
    filteredValues.push_back(filter(lxFilters, 10)); // True
    filteredValues.push_back(filter(lxFilters, 50)); // True
    filteredValues.push_back(filter(lxFilters, 100)); // True
    filteredValues.push_back(filter(lxFilters, 42)); // False

...

1 Ответ

2 голосов
/ 19 апреля 2019

Это возможно следующим образом:

template<typename T>
bool filter(const T& filters, int val)
{
    return std::all_of(std::begin(filters), std::end(filters),
     [val](const auto& func) 
     {
         return func(val);
     });
}
...