Я написал код шаблона, который принимает функтор в качестве аргумента и после некоторой обработки выполняет его. Хотя кто-то может передать эту функцию лямбда, указатель на функцию или даже std::function
, но он предназначен в первую очередь для лямбда (не для того, чтобы запрещать другие форматы). Я хочу спросить, как мне взять эту лямбду - по стоимости? по ссылке? или что-то другое.Прохождение лямбда в качестве аргумента - по ссылке или значению?
Пример кода -
#include <iostream>
#include <functional>
using namespace std;
template<typename Functor>
void f(Functor functor)
{
functor();
}
void g()
{
cout << "Calling from Function\n";
}
int main()
{
int n = 5;
f([](){cout << "Calling from Temp Lambda\n";});
f([&](){cout << "Calling from Capturing Temp Lambda\n"; ++n;});
auto l = [](){cout << "Calling from stored Lambda\n";};
f(l);
std::function<void()> funcSTD = []() { cout << "Calling from std::Function\n"; };
f(funcSTD);
f(g);
}
В коде выше, у меня есть выбор сделать это либо из них -
template<typename Functor>
void f(Functor functor)
template<typename Functor>
void f(Functor &functor)
template<typename Functor>
void f(Functor &&functor)
Что бы быть лучше и почему? Существуют ли какие-либо ограничения для любого из них?
ИМХО, перейдите по значению. – NathanOliver
Я всегда видел, что объекты шаблонов functor передаются по значению, но я не знаю почему; хороший вопрос. – YSC
related/dupe: http://stackoverflow.com/questions/8196345/passing-functor-object-by-value-vs-by-reference-c – NathanOliver