2015-02-19 2 views
0

Джим, кодирующий некоторый класс шаблона для использования математики, например, вектор 2d. Я хотел бы definie постоянного вектора для моего класса: UnityX:Определение константы и шаблон

template <typename T> 
class Vector2 { 

public: 
    ... 
    static Vector2 UnityX(); 
    ... 

    T x,y; 
}; 

И я не знаю, как осуществить это, потому что если я делаю:

template <typename T> 
Vector2<T> Vector2<T>::UnityX() 
{ 
    return Vector2(1, 0); 
} 

я буду иметь некоторые предупреждения во время компиляции причина неявного преобразования типов. предупреждение C4244 от VS2013: преобразование «конверсия» из «type1» в «type2», возможная потеря данных.

Чтобы решить эту проблему, я стараюсь:

template <typename T> 
Vector2<T> Vector2<T>::UnityX() 
{ 
    return Vector2(static_cast<T>(1.0), static_cast<T>(0.0)); 
} 

С помощью этого решения, у меня нет больше предупреждения во время компиляции, но сделать static_cast не будет замедлять работу? Это лучшее решение?

+1

не беспокойтесь о проблемах с производительностью, если вы не можете доказать, что они существуют. и 'static_cast' - лучший способ. –

+0

Как выглядит конструктор Vector2? – swang

+0

Какое точное предупреждение и код конструктора и тип T вы используете? –

ответ

0

Если вы хотите иметь постоянные типы векторных вы могли бы сделать их статические члены класса:

template <typename T> 
class Vector2 
{ 
public: 
    Vector2(const T& x, const T& y) : x(x), y(y) {} 

protected: 
    T x, y; 

public: 
    static const Vector2<T> UnitX; 
}; 

template <typename T> 
Vector2<T> Vector2<T>::UnitX = Vector2<T>(1, 0); 

Теперь, используя это легко, и не требует никаких вызовов функций.

Vector2<float> unitX = Vector2<float>::UnitX; 
+0

Я не уверен, отвечает ли это на вопрос. Он получает предупреждение и хочет знать, как это исправить. –

+0

Он также спрашивает ** «Я хотел бы определить постоянный вектор для моего класса» **, и я даю совет, как это сделать. – Aesthete

Смежные вопросы