Рассмотрим следующий надуманный пример определения шаблонного массива:
template <typename t, unsigned int n> class TBase
{
protected:
t m_Data[n];
//...
};
template <typename t, unsigned int n> class TDerived : public TBase<t, n>
{
TDerived()
{
}
};
Я могу специализировать этот тип, чтобы предоставить конструктор не по умолчанию для массива длиной 2 следующим образом:
template <typename t> class TDerived<t, 2> : public TBase<t, 2>
{
public:
TDerived(const t& x0, const t& x1)
{
m_Data[0] = x0;
m_Data[1] = x1;
}
};
int main()
{
TDerived<float, 2> Array2D_A(2.0f, 3.0f); //uses specialised constructor
TDerived<float, 3> Array3D_A; //uses default constructor
return 0;
}
Is есть ли другой способ создать класс, который имеет различные параметры конструктора, ограниченные параметрами шаблона во время компиляции, без требования полной специализации класса для каждого варианта?
Другими словами, могу ли я иметь специализированные конструкторы в классе TBase
без необходимости в промежуточном этапе создания TDerived
, сохраняя при этом функциональность TBase
?