Не могу использовать лямбда-функцию внутри шаблона функции - PullRequest
0 голосов
/ 27 мая 2018

У меня проблема с моим шаблоном функции.

У меня есть 3 разные коллекции, и у меня есть итераторы для коллекций.Теперь мне нужно создать шаблон функции 'apply' , который будет выполнять следующие действия: 1. Пройти через все элементы коллекций и проверить, является ли предикат истинным:

1.1 Если предикат вернет true -тогда элемент коллекции необходимо изменить с помощью лямбды 'пройдено'

1.2, если предикат возвращает false =, тогда элемент коллекции необходимо изменить с помощью лямбды 'отклонено'

Пожалуйста, дайте мне пример, как мне написать это.

Большое спасибо за помощь.Обновленный код здесь:

#include <iostream>
#include <vector>
#include <list>
#include <functional>

using namespace std;

template<typename T>
void apply(T collBegin, T collEnd, function<bool(int)> f1, function<int(int)> f2, function<int(int)> f3)
{
    for (T actualPosition = collBegin; actualPosition != collEnd; ++actualPosition) {
        if (f1(*actualPosition)) {
            //the argument matches the predicate function f1
            *actualPosition = f2(*actualPosition);
        }
        else {
            //the argument doesn't match the predicate function f1
            *actualPosition = f3(*actualPosition);
        }
    }
}

int main()
{
    int arr[]{ 1,2,3,4,5,6,7,8,9 };

    auto predicate = [](int arg) -> bool { return arg % 2 == 0; };

    auto passed = [](int arg) -> int { return arg / 2; };

    auto rejected = [](int arg) -> int { return (3 * arg) + 1; };

    apply(arr, arr + std::size(arr), predicate, passed, rejected);

    std::vector<int> vec(arr, arr + std::size(arr));
    apply(vec.begin(), vec.end(), predicate, passed, rejected);

    std::list<int> lis(vec.begin(), vec.end());
    apply(lis.begin(), lis.end(), predicate, passed, rejected);


    for (auto e : lis) std::cout << e << " ";
    std::cout << '\n';
}

Этот код работает.Но я хочу изменить его с int на T. Как я могу это сделать?

1 Ответ

0 голосов
/ 27 мая 2018

О, как должен выглядеть код?Можете ли вы написать пример?

Следующие компиляции и запуска, но я не уверен, что это то, что вы хотели:

#include <iostream>
#include <vector>
#include <list>
#include <functional>
#include <algorithm>

template<typename T, typename U>
void apply(T collBegin, T collEnd, std::function<bool(U const &)> f1, std::function<U(U const &)> f2, std::function<U(U const &)> f3)
{
    std::for_each(collBegin, collEnd, [&](auto &el) { el = f1(el) ? f2(el) : f3(el); });
}

int main()
{
    std::function<bool(int const &)> predicate = [](int const &arg) -> bool { return arg % 2 == 0; };
    std::function<int(int const &)> passed = [](int const &arg) -> int { return arg / 2; };
    std::function<int(int const &)> rejected = [](int const &arg) -> int { return (3 * arg) + 1; };

    int arr[]{ 1,2,3,4,5,6,7,8,9 };
    apply(arr, arr + sizeof(arr)/sizeof(int), predicate, passed, rejected);

    std::vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));
    apply(vec.begin(), vec.end(), predicate, passed, rejected);

    std::list<int> lis(vec.begin(), vec.end());
    apply(lis.begin(), lis.end(), predicate, passed, rejected);

    for (auto e : lis) std::cout << e << " ";
    std::cout << '\n';
}

https://ideone.com/A30Dl9

1 2 16 4 4 5 34 1 7 
...