如何创建适配任意类型与不同参数数量的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
相关产品推荐
相关产品推荐

