gpt4 book ai didi

c++ - 如何从 lambda 表达式中导出参数?

转载 作者:太空狗 更新时间:2023-10-29 20:25:04 25 4
gpt4 key购买 nike

如何更改我的模板函数定义以使其正常工作?

考虑以下代码:

#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)

最佳答案

怎么样

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

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

关于c++ - 如何从 lambda 表达式中导出参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25018745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com