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

如何创建适配任意类型与不同参数数量的C++通用工厂函数?

通用工厂函数实现方案

你可以通过可变参数模板实现一个通用的工厂函数,它能支持任意类的实例创建,自动适配不同的构造参数数量和类型。

实现代码

#include <utility> // 用于std::forward
#include <string>
#include <iostream>

class Employee
{
   std::string m_name;
   int m_id;
   int m_salary{};

public:
   template<typename T1, typename T2>
   Employee(T1&& name, T2&& id, T2&& salary)
      : m_name{ std::forward<T1>(name) }, m_id{ id }, m_salary{ salary }
   {
      std::cout << "template Employee constructor" << std::endl;
   }
};

class Contact
{
   std::string m_name;
   long long int m_number;
   std::string m_address;
   std::string m_mail;

public:
   template<typename T1, typename T2>
   Contact(T1&& name, T2&& num, T1&& addr, T1&& mail)
      :m_name{ std::forward<T1>(name) }, m_number{ num }, m_address{ std::forward<T1>(addr) }, m_mail{ std::forward<T1>(mail) }
   // 修正原代码笔误:mail参数对应T1类型,统一用T1转发
   {
      std::cout << "template Contact constructor" << std::endl;
   }
};

// 通用工厂函数模板
template<typename T, typename... Args>
T* createObject(Args&&... args)
{
    return new T{ std::forward<Args>(args)... };
}

// 使用示例
int main()
{
    // 创建Employee实例
    Employee* emp = createObject<Employee>("Alice", 1001, 5000);
    // 创建Contact实例
    Contact* contact = createObject<Contact>("Bob", 13800138000LL, "123 Main St", "bob@example.com");
    
    // 记得释放内存
    delete emp;
    delete contact;
    return 0;
}

关键细节说明

  • 模板参数T:调用时通过<类名>显式指定要创建实例的类(比如Employee或Contact),是工厂函数的核心标识。
  • 可变参数Args&&... args:接收任意数量、任意类型的构造参数,&&是万能引用,配合std::forward实现完美转发——保证参数的左值/右值属性原样传递给类的构造函数,避免不必要的拷贝开销。
  • 完美转发语法:std::forward<Args>(args)...会逐个处理参数包,把每个参数按照原始类型传递给T的构造函数,效果和直接手写new T(...)完全一致。

内容的提问来源于stack exchange,提问作者Muthuraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:45:15