点类型“类型”的强类型解决方案

时间:2016-10-26 04:34:41

标签: c++

我试图用两种“空间类型”来表示点:窗口空间和世界空间。我有一个2d矢量类,它是原始数据。

在不重写我的2d矢量类的情况下,“强类型”这两个的最佳方法是什么?即我将不得不重写所有运算符+ =运算符 - ,运算符+等等。

我目前的两点代码如下。我正在寻找一个“更好的解决方案”。我更好地定义为强类型,并且能够编写如下代码:

pos += {0, -1};

无需为WindowPosition和WorldPosition编写完整的运算符。

我目前的解决方案:

struct WindowPosition
{
  template<typename... Args>
  WindowPosition(Args&&... args)
    : m_coords(std::forward<Args>(args)...)
  {}

  operator math::v2&() { return m_coords; }
  operator const math::v2&() const { return m_coords; };

  math::v2 m_coords;
};


struct WorldPosition
{
    template<typename... Args>
    WorldPosition(Args&&... args)
      : m_coords(std::forward<Args>(args)...)
    {}

    operator math::v2&() { return m_coords; }
    operator const math::v2&() const { return m_coords; };

    WindowPosition ToWindowPosition()
    {
      return globals::CAMERA->ToWindowRelative(m_coords);
    }

    math::v2 m_coords;
};

但这意味着我必须这样做:pos.m_coords + = {0,-1};

有没有更好的方法来实现我上面描述的内容?还是有更惯用的解决方案?

****编辑:这是我最终的结果。谢谢@jzwinck:

struct Window {};
struct World {};

template <typename Tag>
struct Position : math::v2
{
  template<typename... Args>
  Position(Args&&... args)
    : math::v2(std::forward<Args>(args)...)
  {}
};

typedef Position<Window> WindowPosition;
typedef Position<World> WorldPosition;

WindowPosition ToWindowPosition(const WorldPosition& pos)
{
  return globals::CAMERA->ToWindowRelative(pos);
}

1 个答案:

答案 0 :(得分:4)

模板!

struct Window {};
struct World {};

template <typename Tag>
struct Position
{
  template<typename... Args>
  Position(Args&&... args)
    : m_coords(std::forward<Args>(args)...)
  {}

  operator math::v2&() { return m_coords; }
  operator const math::v2&() const { return m_coords; };

  math::v2 m_coords;
};

typedef Position<Window> WindowPosition;
typedef Position<World> WorldPosition;

WindowPosition ToWindowPosition(const WorldPosition& pos)
{
  return globals::CAMERA->ToWindowRelative(pos);
}