Учитывая шаблонный фабричный метод, я хотел бы вызвать различные конструкторы, основанные на конструкторах, которые предоставляет параметр шаблона:
template<typename T>
T* Factory::create()
{
if (hasOnlyDefaultConstructor<T>())
return new T();
else
return new T(this);
}
Две проблемы:
- Если T не имеет конструктора T (Factory *), тогда возникают проблемы компиляции.
- Как написать hasOnlyDefaultConstructor ()?
В общем, я хотел бы следующее:
template<typename T>
T* Factory::create()
{
if (hasDefaultConstructor<T>())
return new T();
else if (hasUnaryConstructor<T>())
return new T(create());
else if (hasBinaryConstructor<T>())
return new T(create(), create());
else ....
}
Есть ли способ достичь этого в C ++? Я понимаю проблемы, если есть несколько конструкторов для выбора компилятора, но допустим, что мы передаем только типы T, которые имеют ровно один открытый конструктор.
class A
{
A(B* b);
}
class B
{
B(C* c, D* d);
}
A* a = Factory::create<A>(); // same as A* a = new A(new B());
B* b = Factory::create<B>(); // same as B* b = new B(new C(), new D());
Разве нельзя написать общую функцию create (), которая могла бы создавать экземпляры как B, так и A?