c++ - 在 C++ 中的不同几何类之间轻松转换?

标签 c++ casting geometry ros

我从事机器人技术工作,这意味着我使用了大量处理 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 类型编写三个辅助函数来访问 XYZ:

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

Live demo .

关于c++ - 在 C++ 中的不同几何类之间轻松转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33400274/

相关文章:

c++ - itk::SmartPointer 的指针转换?

c++ - 将运算符强制转换为指针

mysql - 如何阻止 Rails 转义 SQL 中特定列的值?

c++ - ifstream 读取所有以开头的文件

c++ - 在终止 c++ 之前调用函数

objective-c - Swift:对具有相同选择器的对象进行类型转换

javascript - 如何在 three.js 中修复圆 Angular 平面上的纹理

c++ - 如何使用 boost::signals 来实现观察者模式?

c++ - 为什么模板推导需要默认模板?

python中点线裁剪算法