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

如何实现Wrapper类的call_to_func方法使其参数列表与目标函数一致

如何实现Wrapper类的call_to_func方法使其参数列表与目标函数一致

嗨,这问题我太熟了!你想要让Wrapper里的call_to_func方法参数列表和目标类里的func完全对齐,直接用C11及以后支持的可变参数模板+完美转发就能解决,这是现代C里适配任意参数列表的常用操作。

先给你看修改后的完整可运行代码,一看就懂:

#include <utility> // 必须包含这个头文件,std::forward需要它

class A
{
public: // 注意这里要把func设为public,不然Wrapper里访问不到哦
    void func(int, char, double)
    {
        // 可以加个输出验证调用是否成功
        // std::cout << "A::func 被调用啦!\n";
    }
};

template<class T>
class Wrapper
{
public:
    // 用可变参数模板接收任意参数列表,完美转发给m_t.func
    template<typename... Args>
    void call_to_func(Args&&... args)
    {
        // 完美转发参数,确保参数的左值/右值特性原封不动传递
        m_t.func(std::forward<Args>(args)...);
    }

    T m_t;
};

// 测试一下调用是否正常
int main()
{
    Wrapper<A> wrap;
    wrap.call_to_func(10, 'a', 3.14); // 直接传和A::func匹配的参数就行
    return 0;
}

给你拆解下几个关键细节:

  • template<typename... Args>:这是可变参数模板,Args...是参数包,能接收任意数量、任意类型的参数——不管目标func是3个参数还是更多,都能自动适配,不用手动改Wrapper的代码
  • Args&&... args + std::forward<Args>(args)...:这里的&&是万能引用,搭配std::forward实现完美转发,简单说就是把你传入的参数原封不动地传给m_t.func,既不会丢失参数的左值/右值特性,也能避免不必要的拷贝
  • 目标类里的func一定要设为public,不然Wrapper的成员函数会没有权限调用它
  • 别忘了包含<utility>头文件,std::forward的定义就在这里面

这样实现后,哪怕你后续给A的func修改参数列表,或者换其他带func方法的类作为T传入Wrapper,call_to_func都能自动匹配参数列表,超级灵活!

备注:内容来源于stack exchange,提问作者herzl shemuelian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 09:50:27