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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:54:02