【发布时间】:2017-07-11 10:04:12
【问题描述】:
我编写了一个模板代码,它接受一个函子作为参数,经过一些处理后,执行它。尽管其他人可能会将该函数传递给 lambda、函数指针甚至 std::function,但它主要用于 lambda(不是我禁止其他格式)。我想问我应该如何取那个 lambda - 按值?引用?或者别的什么。
示例代码-
#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)
什么是更好的方法,为什么?这些有什么限制吗?
【问题讨论】:
-
恕我直言,按值传递。
-
我一直看到仿函数模板对象按值传递,但我不知道为什么;好问题。
标签: c++ function c++11 lambda c++14