Мне нужно создать фабричную функцию для создания экземпляра, который может принимать любой тип с разным количеством аргументов.
У меня есть два класса 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 };
}
Я попробовал функцию создания экземпляра класса Employee
. Но я не знаю, что делать для обоих классов!
[...] Я не знаю, что делать для обоих классов?
Ваш createObject()
просто нужно изменить таким образом, чтобы
Что-то вроде:
template<typename T, typename... Args>
T* createObject(Args&&... args)
{
return new T{ std::forward<Args>(args)... };
}
В качестве примечания: обычно лучше отдавать предпочтение интеллектуальным указателям ручному управлению памятью, за исключением случаев использования необработанных указателей с новыми/удалением в учебных целях.