绕过 Eigen 静态断言

Getting around Eigen static assertions

我有一些代码可以在 2 维或 3 维中 运行。这是在编译时使用宏设置的。但是,以下会导致 Eigen 出现问题:

// Assume two vectors exist a and b
if (dimensions == 3) {
    a.cross(b);
}

在 2 维中,叉积会触发 Eigen 的静态断言,即使此代码实际上永远不会 运行。

我该如何解决这个问题?如果可能的话,我想避免使用更多的宏。

您不能直接执行此操作,因为编译器应该能够为所有分支生成代码,无论它们是否在 运行 时实际执行。如果您可以访问 C++17 编译器并且 dimensionconstexpr,您可以使用 if constexpr:

template<int dimension>
void foo()
{
    ...
    if constexpr (dimension == 3) {
        a.cross(b);
    }
    ...
}

如果您的编译器不支持if constexpr,您可以使用标签调度来模仿它。