代码之家  ›  专栏  ›  技术社区  ›  Muthuraj

如何创建一个通用工厂来创建某种类型的实例[重复]

  •  0
  • Muthuraj  · 技术社区  · 1 年前

    我需要创建一个工厂函数来创建一个实例,该实例可以接受具有不同数量参数的任何类型。

    我有两个类Employee和contact,并通过单个工厂函数为这两个类创建一个实例

    我不知道该怎么做。帮我做那个

    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<T2>(mail) }
        {
            std::cout << "template Contact constructor" << std::endl;
        }
    };
    
    template<typename T1, typename T2>
    Employee* createObject(T1&& a, T2&& b, T2&& c)
    {
        return new Employee{ std::forward<T1>(a), b, c };
    }
    

    我尝试了一个为雇员类创建实例的函数。但我不知道这两门课该怎么办

    1 回复  |  直到 1 年前
        1
  •  3
  •   JeJo    1 年前

    […]我不知道这两节课该怎么办?

    你的 createObject() 只需要在某种程度上进行修改

    • 它还可以采用必须创建对象的类的类型,以及
    • variadic template 参数的参数。

    类似于:

    template<typename T, typename... Args>
    T* createObject(Args&&... args)
    {
       return new T{ std::forward<Args>(args)... };
    }
    

    Live demo


    顺便说一句,通常最好 prefer smart pointers 超过手动内存管理,除非出于学习目的使用带有new/delete的原始指针。