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

问题描述

上下文

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

GLM:vec4(v1,v2);

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

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

使用本征方式,您必须进行串联,将其存储在变量中,然后使用该变量。就语法而言,Eigen的方法在客观上并没有那么广泛。

这是我最讨厌的东西之一,但是Eigen充满了这样的东西,而且我已经厌倦了必须遵守它想要的和我想要写的东西。

考虑到这一点,我在想也许可以为小情况(4维对象)添加构造函数,以使Eigen更像glm。但是,由于类定义位于本征源代码中,因此这意味着要理解和修改其源代码,这具有必须维护该代码的缺点,除非将其合并到本征源中,否则可能会花费更长的时间。等待,甚至无法接受。

实际问题

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

解决方法

您要寻找的功能是扩展功能。某些语言,例如Kotlin have them,但C ++则没有。所以你不走运。

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

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

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