У меня работает следующее:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
template <typename a, typename F>
void printWith(vector<a> foo, F f){
for_each(foo.begin(), foo.end(), [&](a x){cout << f(x) << " "; });
}
int main(){
vector<int> foo = {1,2,3,4,5};
printWith(foo, [](int x) {return x + 1;});
std::cout << '\n';
return 0;
}
Тестирование:
$ g++-4.5 -std=gnu++0x -Wall test.cpp
$ ./a.out
2 3 4 5 6
В качестве альтернативы, вы можете использовать тот факт, что типы закрытия не имеют лямбда-захвата может быть неявно преобразовано в указатели на функции.Это ближе к вашему исходному коду, а также сокращает количество экземпляров шаблона функции (в исходном решении вы получаете новый экземпляр каждый раз, когда используете шаблон функции с другим типом объекта функции; обратите внимание, что он не 'В данном конкретном случае это не имеет большого значения, поскольку функция printWith
очень короткая и, скорее всего, всегда будет встроенной):
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
template <typename a, typename b>
void printWith(const vector<a>& foo, b f(a)){
for_each(foo.begin(), foo.end(), [=](a x){cout << f(x) << " "; });
}
int main(){
vector<int> foo = {1,2,3,4,5};
printWith<int, int>(foo, [](int x) {return x + 1;});
std::cout << '\n';
return 0;
}
К сожалению, неявное преобразование не очень хорошо работает с выводом аргумента шаблона: asВы можете видеть, я должен был указать аргументы шаблона при вызове printWith
.
Другой альтернативой является использование std::function
.Это также помогает минимизировать количество экземпляров шаблона и работает даже для лямбда-выражений с лямбда-захватом, но имеет те же проблемы с выводом аргумента шаблона:
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
using namespace std;
template <typename a, typename b>
void printWith(const vector<a>& foo, std::function<b(a)> f){
for_each(foo.begin(), foo.end(), [&](a x){cout << f(x) << " "; });
}
int main(){
vector<int> foo = {1,2,3,4,5};
int y = 1;
printWith<int, int>(foo, [&](int x) { return x + y; });
std::cout << '\n';
return 0;
}