You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何传递可变数量的模板参数?如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:09:06