绕过 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 编译器并且 dimension
是 constexpr
,您可以使用 if constexpr
:
template<int dimension>
void foo()
{
...
if constexpr (dimension == 3) {
a.cross(b);
}
...
}
如果您的编译器不支持if constexpr
,您可以使用标签调度来模仿它。
我有一些代码可以在 2 维或 3 维中 运行。这是在编译时使用宏设置的。但是,以下会导致 Eigen 出现问题:
// Assume two vectors exist a and b
if (dimensions == 3) {
a.cross(b);
}
在 2 维中,叉积会触发 Eigen 的静态断言,即使此代码实际上永远不会 运行。
我该如何解决这个问题?如果可能的话,我想避免使用更多的宏。
您不能直接执行此操作,因为编译器应该能够为所有分支生成代码,无论它们是否在 运行 时实际执行。如果您可以访问 C++17 编译器并且 dimension
是 constexpr
,您可以使用 if constexpr
:
template<int dimension>
void foo()
{
...
if constexpr (dimension == 3) {
a.cross(b);
}
...
}
如果您的编译器不支持if constexpr
,您可以使用标签调度来模仿它。