如何传递可变数量的模板参数?如何为Foo类传递函数调用参数?
解决Foo类中函数参数传递的问题
嘿,我来帮你搞定这个问题!你的代码里有两个关键问题需要修正,咱们一步步来梳理:
1. 让call方法正确传递参数
你当前的call方法只是声明了参数类型,但没有给参数命名,也没有把这些参数传递给内部的func。我们需要修改call方法,让它接收参数并转发给存储的函数对象。这里推荐用完美转发(std::forward)来保持参数的左值/右值属性,避免不必要的拷贝。
修正后的Foo结构体:
#include <functional> #include <utility> // 引入std::forward template<class R, class... Args> struct Foo { std::function<R(Args...)> func; // 接受左值引用的构造函数 Foo(const std::function<R(Args...)> &funcIn) : func(funcIn) {} // 可选:添加接受右值引用的构造函数,提升效率 Foo(std::function<R(Args...)> &&funcIn) : func(std::move(funcIn)) {} // 修正后的call方法,完美转发参数 R call(Args... args) { return func(std::forward<Args>(args)...); } };
2. 修正示例中的类型匹配问题
你示例里的typedef typename Foo<int(int)> Bar;存在类型不匹配:int(int)表示的是接受1个int参数、返回int的函数类型,但你传入的lambda是接受2个int参数的。所以需要把类型定义改成匹配lambda签名的形式:
修正后的main函数:
int main() { // 正确的类型:接受两个int参数,返回int using Bar = Foo<int(int, int)>; // 初始化Foo实例,传入目标lambda Bar x([](int y, int z){return y + z + 2;}); // 调用call方法并传递参数 int result = x.call(3, 5); // 计算结果:3+5+2=10 }
这样修改后,你就可以通过call方法把参数正确传递给存储的函数对象了。如果需要处理更复杂的参数(比如带默认值、或者可变参数的函数),这个结构也能很好地适配。
内容的提问来源于stack exchange,提问作者Benjamin Barrois
相关产品推荐
相关产品推荐

