1
我试图在两种“空间类型”中表示点:窗口空间和世界空间。我有一个二维矢量类,这是原始数据。针对“类型”的强类型解决方案
什么是“强类型”这两个不重写我的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,1}等:(我觉得这是围绕它的一部分没有办法不用写一个完整的 – tmruss
@tmruss:如果你通过将'math :: v2'设置为'Position'的公共基类来调整它,而不是将它作为一个成员进行聚合和公开显示呢? –
我也离开了模板,因为我想要隐藏ToWindowPosition在cpp文件中的实现最终,独立函数方法也是一种选择,但比成员func更难使用 – tmruss