У меня проблема с моим шаблоном функции.
У меня есть 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. Как я могу это сделать?