如何为C++ caller类添加支持可变参数、多类型的模板构造函数
实现方案
你要的可变参数类构造函数可以通过构造函数模板+可变参数模板+完美转发实现,完全兼容你之前的函数模板效果,同时支持任意数量、任意类型的参数传入。
完整caller类实现
#include <iostream> #include <utility> // 用于完美转发的工具头 class caller { public: // 保留原有默认构造函数 caller(){ std::cout << "Constructor default" << std::endl; } // 原有单int入参构造可保留也可删除,新的可变参数构造会覆盖该场景 caller(void (*Optype)(int),int a){ Optype(a); std::cout << "Constructor 1" << std::endl; } // 新增可变参数模板构造函数 template <class Ret, class... Args> caller(Ret (*f)(Args...), Args&&... args) { f(std::forward<Args>(args)...); std::cout << "Variable parameter constructor called" << std::endl; } };
实现说明
- 模板参数
Ret匹配目标函数的返回值类型,Args...是可变参数包,可匹配任意数量、任意类型的函数入参 - 用
Args&&+std::forward实现完美转发,避免参数拷贝,同时兼容左值、右值参数传入 - 完全匹配你之前实现的函数模板的功能,只要传入的参数和目标函数的参数列表匹配即可正常调用
扩展测试用例
除了你原有的测试逻辑,还可以验证多类型、多参数的支持效果:
#include <iostream> #include "caller" using namespace std; void foo(int a){ cout << a << endl; } // 新增多参数不同类型的测试函数 void bar(double num, string str, bool flag) { cout << "double: " << num << ", string: " << str << ", bool: " << flag << endl; } int main() { caller c; // 调用默认构造 caller(); // 生成临时对象调用默认构造 caller(foo,2); // 匹配单int参数场景 caller(bar, 3.14, "test", true); // 多类型多参数场景测试 return 0; }
编译注意事项
- 要求C++11及以上版本支持,编译时需添加对应版本参数(如GCC/Clang添加
-std=c++11) - 当前实现仅支持普通函数指针,若需要支持lambda、类成员函数、仿函数等可进一步扩展模板逻辑。
内容的提问来源于stack exchange,提问作者Hesam
相关产品推荐
相关产品推荐

