Классы шаблонов со специализированными конструкторами

Рассмотрим следующий надуманный пример определения шаблонного массива:

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 ?

5
задан Munro 11 August 2011 в 15:00
поделиться