2015-05-06 2 views
0

Я пишу свой собственный класс векторов, и у меня проблема. Я определил свой класс как шаблон, у меня есть определение для каждого из размеров вектора, и я хочу, чтобы конкретный конструктор для каждого из размеров вектора. вот код:Конкретный конструктор шаблона

template<int size> 
ref class Vector 
{ 
internal: 

    Vector(int _x, int _y, int _z, int _w); 
private: 

    float *m_data = new float[4]; 
}; 

и определения является:

using Vector2 = Vector<2>; 
using Vector3 = Vector<3>; 
using Vector4 = Vector<4>; 

первую очередь я могу это сделать? если да, то как?

+0

Ваш класс 'Вектор <2>' не имеет никакого отношения к '' Vector <3>, они имеют разные типы. Для каждого экземпляра шаблона определяется конструктор, поэтому вы в порядке. Возможно, вы хотите сделать что-то еще, так как я не вижу, чтобы вы использовали «размер» где угодно. Если да, уточните этот вопрос. – vsoftco

+0

спасибо за ответ, я получу свой ответ. – user3877301

ответ

0

Если вы хотите общий интерфейс, определить конструктор, как имеющие 4 аргументов и специализироваться его. Внутри инициализировать только те элементы, которые действительны для вектора такого размера:

template <> 
Vector<1>::Vector(int _x, int _y, int _z, int _w) 
: x(_x) //1D vector has only 'x' 
{ 
} 

template <> 
Vector<2>::Vector(int _x, int _y, int _z, int _w) 
: x(_x) 
, y(_y) //2D vector has 'x' and 'y' 
{ 
} 

и т.д. Но это некрасиво, заставляет вас совершать какие-то вещи «общие», например, вы будете держать 4 компонент даже для 2D vector , Существуют обходные пути (шаблонная структура, используемая как переменная-член, специализированная для вектора каждого размера), но это довольно сложно. Так как векторы разного размера фактически различных типов, я пошел бы для полного класса специализации:

template<int size> 
class Vector; 

template<> 
class Vector<1> 
{ 
protected: 
    int x; 

public: 
    Vector(int _x) 
    : x(_x) 
    { } 

    //other members 
}; 

template<> 
class Vector<2> 
{ 
protected: 
    int x, y; 

public: 
    Vector(int _x, int _y) 
    : x(_x) 
    , y(_y) 
    { } 

    //other members 
}; 

Затем вы можете использовать его таким образом:

Vector<1> v_1(2); 
Vector<2> v_2(4, 6); 
//etc... 

Кроме того, второе решение позволит клиентам вашего вектора, чтобы создать экземпляр только для тех size s, которые вы явно разрешите.

+0

Да, я думаю, что ты прав, я иду на этот подход. – user3877301

0

Если вы действительно хотите различное поведение для каждого экземпляра шаблона, вы можете сделать это так:

//specific version for when 0 is passed as the template argument 
template<> 
Vector<0>::Vector (int _x, int _y, int _z, int _w) 
{ 
    //some Vector<0> related stuff 
} 

//Vector<1> will use the default version 

//specific version for when 2 is passed as the template argument 
template<> 
Vector<2>::Vector (int _x, int _y, int _z, int _w) 
{ 
    //some Vector<2> related stuff 
} 
0

С C++ 11, вы можете сделать что-то вроде:

template<int size> 
class Vector 
{ 
public: 

    template <typename ...Ts, 
       typename = typename std::enable_if<size == sizeof...(Ts)>::type> 
    explicit Vector(Ts... args) : m_data{static_cast<float>(args)...} {} 
private: 
    float m_data[size]; 
}; 

using Vector2 = Vector<2>; 
using Vector3 = Vector<3>; 
using Vector4 = Vector<4>; 

int main() 
{ 
    Vector2 v2(42, 5); 
    Vector3 v3(42, 5, 3); 
    Vector4 v4(42, 5, 51, 69); 
} 
Смежные вопросы