如何从lambda表达式派生参数?

时间:2014-07-29 15:08:38

标签: c++ c++11 lambda

如何更改模板功能定义以使其起作用?

请考虑以下代码:

#include <iostream>

#include <functional>

using namespace std;

void callthis(function<void()> func){
    func();
}

void callthis(function<void(int)> func, int par){
    func(par);
}


template<typename... Args>
void callthistemp(function<void(Args...)> func, Args&&... args){
    func(std::forward<Args>(args)...);
}

int main(){

callthis([](){cout << "hello " << endl;}); // (1)
callthis([](int x)->void{cout << "hello " << x << endl;},1); //(2)
function<void(int)> xx = [](int x){cout << "hello" << endl;};
callthistemp(xx,1);//(3)

//callthistemp([](int x)->void{cout << "hello" << endl;},1); //(4)
//callthistemp<int>([](int x)->void{cout << "hello" << endl;},1); //(5)
}

前三种情况都运行良好,但最后两种情况不能编译,并给出错误

lambdatemplate.cpp: In function ‘int main()’:
lambdatemplate.cpp:29:66: error: no matching function for call to ‘callthistemp(main()::__lambda3, int)’
     callthistemp<int>([](int x)->void{cout << "hello" << endl;},1); //(5)
                                                                  ^
lambdatemplate.cpp:29:66: note: candidate is:
lambdatemplate.cpp:17:6: note: template<class ... Args> void callthistemp(std::function<void(Args ...)>, Args&& ...)
 void callthistemp(function<void(Args...)> func, Args&&... args){
      ^
lambdatemplate.cpp:17:6: note:   template argument deduction/substitution failed:
lambdatemplate.cpp:29:66: note:   ‘main()::__lambda3’ is not derived from ‘std::function<void(Args ...)>’
     callthistemp<int>([](int x)->void{cout << "hello" << endl;},1); //(5)

2 个答案:

答案 0 :(得分:5)

怎么样

template<typename L, typename... Args>
void callthistemp(L const &func, Args&&... args)
{
  func(std::forward<Args>(args)...);
}

使用模板时,无需将lambda包装成(有时是昂贵的)std :: function。 (昂贵意味着它可能使用堆分配,在这种情况下不需要)。

答案 1 :(得分:1)

lambda不是任何模板参数的std ::函数。这就是出现问题的原因。编译器说明说明了一切。

main()::__lambda3’ is not derived from ‘std::function<void(Args ...)>’

这是工作电话所需要的。你将不得不构建一个临时的或者可能创建一个make_function类的东西。前三个工作是因为你没有尝试将lambda作为模板化的std :: function传递。