2016-10-26 36 views
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); 
} 

回答

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

我实现了在这个代码*确切*同样的事情,但我还是不能做运营商+ = {0,1}等:(我觉得这是围绕它的一部分没有办法不用写一个完整的 – tmruss

+0

@tmruss:如果你通过将'math :: v2'设置为'Position'的公共基类来调整它,而不是将它作为一个成员进行聚合和公开显示呢? –

+0

我也离开了模板,因为我想要隐藏ToWindowPosition在cpp文件中的实现最终,独立函数方法也是一种选择,但比成员func更难使用 – tmruss