我从事机器人技术工作,这意味着我使用了大量处理 3D 几何的开源项目。由于类(class)和数学往往相当简单,每个人似乎都实现了自己版本的 Vector3D、四元数等,每个版本都有细微的变化,例如vec.x, vec.X, vec.x().因此在一个项目中,可能需要在 Eigen、ROS、Assimp、Bullet 和相同基础类的其他版本之间进行转换。在 C++ 中是否有一种简单或优雅的方法不需要从每个库到每个其他库的 n^2 映射?
类似于: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;
}
编辑:
如果有大约 10 个不同的几何库,一个特定的项目可能只使用其中的 2-4 个,所以我想避免引入对所有未使用的库的依赖。我希望得到类似 static_cast<b::Vec>(a::Vec)
的东西, 或者也许
c::Vec vc = my_cvt<c::Vec>(vb + my_cvt<b::Vec>(va));
但是我对模板和 type_traits 的理解很薄弱。
最佳答案
如果您为每个 vector 类型编写三个辅助函数来访问 X
、Y
和 Z
:
double X(const a::Vector& v) { return v.x; }
double Y(const a::Vector& v) { return v.y; }
double Z(const a::Vector& v) { return v.z; }
double X(const c::Vector& v) { return v.x(); }
double Y(const c::Vector& v) { return v.y(); }
//...
然后您就可以轻松编写适用于任何类型的模板函数。例如:
template<typename V1, typename V2>
V1 operator+(const V1& v1, const V2& v2) {
return {X(v1)+X(v2), Y(v1)+Y(v2), Z(v1)+Z(v2)};
}
template<typename V1, typename V2>
V1 convert(const V2& v) {
return {X(v), Y(v), Z(v)};
}
int main() {
a::Vector va;
b::Vector vb;
auto vc = convert<c::Vector>(va + vb);
}
关于c++ - 在 C++ 中的不同几何类之间轻松转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33400274/