我在機器人工作,這意味着我使用大量的處理3D幾何的開源項目。由於類和數學通常相當簡單,所以每個人似乎都實現了自己的Vector3D,四元數等版本,每個版本都有輕微的變化,例如, vec.x,vec.X,vec.x()。因此在一個項目中,可能需要在Eigen,ROS,Assimp,Bullet和其他相同基本類的版本之間進行轉換。有沒有一種簡單或優雅的方式在C++中執行此操作,而不需要從每個庫到每個其他庫的n^2映射?在C++中輕鬆轉換不同的幾何類?
類似於:This SO question,但我無法編輯任何源庫。
實施例:
namespace a
{
class Vector
{
public:
double x, y, z;
};
} // namespace a
namespace b
{
class Vector
{
public:
double X, Y, Z;
};
} // namespace b
namespace c
{
class Vector
{
public:
double& x() { return mx; }
double& y() { return my; }
double& z() { return mz; }
private:
double mx, my, mz;
};
} // namespace c
int main()
{
a::Vector va;
b::Vector vb;
c::Vector vc = va + vb; // Ideal, but probably unrealistic goal
return 0;
}
EDIT: 如果有〜10個不同的幾何形狀庫,一個特定的項目可以僅使用其中的2-4,所以我想避免上引入的依賴所有未使用的庫。我希望這樣的事情static_cast<b::Vec>(a::Vec)
,也許
c::Vec vc = my_cvt<c::Vec>(vb + my_cvt<b::Vec>(va));
,但我的模板和type_traits理解是相當薄弱。
選擇一箇中介,並將其轉換爲中間數據。 – jaggedSpire
@arprice如果你不能改變他們三個,考慮爲我的答案添加一個自定義類(一個向量類),它應該擴展你的需求 –