2010-03-15 27 views
4

說我有:C++:Vector3型「牆」?

class Vector3 { 
    float x, y, z; 
    ... bunch of cuntions .. 
    static operator+(const Vector3&, const Vector3); 
}; 

現在,假設我要上課:

Position, Velocity, 

是完全一樣的Vector3(基本上,我想

typedef Vector3 Position; 
typedef Vector3 Velocity; 

除此之外,鑑於:

Position position; 
Vector3 vector3; 
Velocity velocity; 

我想確保以下無法發生:

position + vector3; 
vector3 + velocity; 
velocity + position; 

什麼是實現這一目標的最佳途徑?

+1

你想要的是單位,這可能不是微不足道的。 Boost有這樣的事情。 http://www.boost.org/doc/libs/1_42_0/doc/html/boost_units.html – GManNickG 2010-03-15 23:33:05

回答

3

我建議是這樣的:

template<typename tag> 
class Vector3 { 
    float x, y, z; 
    ... bunch of functions .. 
    static operator+(const Vector3&, const Vector3); 
}; 

struct position_tag {}; 
struct velocity_tag {}; 
typedef Vector3<position_tag> Position; 
typedef Vector3<velocity_tag> Velocity; 

在這裏看到一個更復雜的例子:Boost MPL

1

而不是使用的typedef,您可以從派生的Vector3位置&速度。然後從Vector3中刪除operator +,並在位置& Velocity中定義它。

class Vector3 { 
    float x, y, z; 
    ... bunch of cuntions .. 
}; 

class Position : public Vector3 { 
    static Position operator+(const Position&, const Position&); 
} 

class Velocity : public Vector3 { 
    static Velocity operator+(const Velocity&, const Velocity&); 
}