我试图用两种“空间类型”来表示点:窗口空间和世界空间。我有一个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);
}
答案 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);
}