如何实现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
相关产品推荐
相关产品推荐

