SFML的Vector2实现允许使用以下语法:
sf::Vector2f v1(16.5f, 24.f);
sf::Vector2f v2 = v1 * 5.f;
sf::Vector2f v3;
...意味着您在创建对象时不必指定模板参数。我试图为了我自己的目的重现这个代码,但我无法看到它是如何工作的。这是它的样子:
template <typename T>
class Vector2
{
public :
Vector2();
Vector2(T X, T Y);
template <typename U>
explicit Vector2(const Vector2<U>& vector);
// Member data
T x;
T y;
};
我的尝试是什么样的:
#include <type_traits>
template <typename T, typename = typename std::enable_if<
std::is_same<T, int>::value
|| std::is_same<T, float>::value, T>::type>
struct Point
{
T x, y;
Point(T x, T y) : x(x), y(y)
{
}
template <typename U>
explicit Point(const Point<U>& point)
: x(point.x), y(point.y)
{
}
};
但我仍然收到错误&#39;缺少模板参数&#39;。什么是SFML,我不是?
答案 0 :(得分:3)
通常这是通过typedef
:
typedef Vector2<float> Vector2f;
或类型别名:
using Vector2f = Vector2<float>;
后者在C ++ 11之前无效。
答案 1 :(得分:3)
在您链接的源文件中,请注意底部附近的这一行:
typedef Vector2<float> Vector2f;
这是Vector2<float>
类型的别名Vector2f
- 它们是相同的类型,只能使用不同的名称。
你可以做同样的事情:
typedef Point<float> Pointf;
typedef Point<int> Pointi;