是否可以在不编辑源文件的情况下在库 (Eigen) 中为 类 创建新功能? (C++)

Is it possible to create new funcitonality for classes in a library (Eigen) without editing the source file? (C++)

上下文

我被迫从 glm 切换到 Eigen 只是因为 eigen 可以处理超过 4 的维度而且我不想同时拥有 2 个不同的 lin alg 库。就可用性而言,Eigen 比 glm 差无限倍。考虑连接 2 个向量的简单操作:

GLM:vec4(v1, v2);

本征:Vector4f v; v << v1, v2;

GLM 可以就地完成,这意味着您可以在对函数的调用中或在具有多个数学运算的复杂行的中间附加。

使用 Eigen 方法,您必须进行串联,将其存储在一个变量中,然后使用该变量。就语法而言,Eigen 的方式在客观上不太通用。

这是我最讨厌的事情之一,但 Eigen 充满了这样的东西,我厌倦了不得不遵守它想要的东西而不是我想写的东西。

考虑到这一点,我在想也许我可以为小情况(4 维对象)添加构造函数,使 Eigen 感觉更像 glm。然而,由于 class 定义在 eigen 的源代码中,这意味着理解和修改它的源代码,其缺点是必须维护该代码,除非我可以将它合并到 eigen 的源代码中,这可能需要更长的时间比我更愿意等待,甚至可能不被接受。

真题

我可以获取在其他地方定义的 class 并创建一个新的构造函数吗?

您正在寻找的功能是扩展功能。有些语言比如 Kotlin have them,但 C++ 没有。所以你运气不好。

如果您创建了自己的矢量库,那没问题,因为您可以创建一个从其他矢量隐式转换的构造函数和一个隐式转换为其他矢量的 operator。如果你在库之间迁移并且不需要保持两个版本都是最新的,你可以添加这两个功能并解决几乎所有的兼容性问题。

至少你可以在类之外定义运算符,比如:

glm::vec4 operator+(glm::vec4 a, Eigen::Vector4f b) {
    return a + eigen_vector_to_glm_vector(b);
}