用于"types"点的强类型解决方案



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

在不重写我的2d向量类的情况下,"强类型"这两个最好的方法是什么?我必须重写所有的operator+= operator-, operator+等等。

这两个点的当前代码如下。我在寻找一个"更好的解决方案"。我将其定义为强类型,并且能够编写这样的代码:

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;
};

但这意味着我必须这样做:poss . m_coordds += {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);
}

模板!

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);
}

相关内容

最新更新