Windows 10 / 特征3 3.4.0-1 / MSYS2/MinGW64 13.1.0 / c++20
为了利用 SIMD 矢量化,我计划使用 vector4d 作为 vector3d。为了使代码不那么混乱并且更加用户友好,这里是实现
typedef Eigen::Vector4d Vec3;
问题是当我使用
创建 vec 时Vec3 u(1,2,3);
编译器由于第四个缺失值而显示错误。正确的语法是:
Vec3 u(1,2,3,4);
但这又让代码变得更加混乱。在 MSVC 编译器上,可以具有相同的类型和函数名称。示例:
typedef Eigen::Vector4d Vec3;
inline Eigen::Vector4d Vec3(double x, double y, double z) {
return Eigen::Vector4d(x, y, z, 0.0);
}
inline Eigen::Vector4d Vec3() {
return Eigen::Vector4d(0.0, 0.0, 0.0, 0.0);
}
Vec3 v = Vec3(1,2,3);
Vec3 w = Vec3();
不幸的是,该功能在 g++/gcc 上不可用。考虑到这里的一切就是我的最终实现:
typedef Eigen::Vector4d Vec3;
inline Eigen::Vector4d Vec3Init(double x, double y, double z) {
return Eigen::Vector4d(x, y, z, 0.0);
}
inline Eigen::Vector4d Vec3Init() {
return Eigen::Vector4d(0.0, 0.0, 0.0, 0.0);
}
Vec3 v = Vec3Init(1,2,3);
Vec3 w = Vec3Init();
有什么想法可以让生活更轻松吗?
您可以创建一个继承自
Eigen::Vector4d
的类,并重载(某种)构造函数以采用 3 个参数。缺点是你总是会得到第四个值。
#include <iostream>
#include <Eigen/Dense>
class Vec3 : public Eigen::Vector4d {
public:
Vec3(double x, double y, double z, double foo = 0.0) : Eigen::Vector4d(x, y, z, foo){}
};
int main(int argc, char * argv []){
Vec3 vec3 = Vec3(1,2,3);
std::cout << vec3 << std::endl;
return 0;
}
这是该代码的输出。
1 2 3 0
这可能会产生副作用,例如进行叉积或矩阵乘法,您可能不希望 4x1 向量在幕后做事。我也不知道您需要哪些(如果有)额外的重载。