你如何避免为类指定模板参数?

时间:2014-08-26 05:59:03

标签: c++ templates

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,我不是?

2 个答案:

答案 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;