unaryExpr无法在MSVC中的自定义lambda下将X类型的矩阵转换为Y类型,但可以使用GCC和clang。以前有人遇到过这种情况吗?有什么变通办法吗?在我给出的例子中,我使用了一个矩阵,但在我的应用程序中,我用了一个稀疏矩阵,所以它不像转换我不认为的底层数组那么容易。
https://godbolt.org/z/TnKf7e
#include <Eigen/Core>
#include <string>
struct Expression {
std::string d_ = "doesn't matter";
};
int main() {
Eigen::Matrix<Expression, 3, 3> in;
Eigen::Matrix3d out = in.unaryExpr([](const Expression& x) -> double { return 3.0; });
}
在MSVC中设置CXX标准是不够的。这是因为Eigen正在检查Meta.h.中__cplusplus的值
若要编译此代码,请添加以下编译选项:/Zc:__cplusplus。
关于CMake:
set_property(TARGET main PROPERTY CXX_STANDARD 17)
add_compile_options(/Zc:__cplusplus)
特征中的相关代码:
#ifndef EIGEN_HAS_STD_RESULT_OF
#if EIGEN_MAX_CPP_VER>=11 && ((__has_feature(cxx_lambdas) || (defined(__cplusplus) && __cplusplus >= 201103L)))
#define EIGEN_HAS_STD_RESULT_OF 1
#else
#define EIGEN_HAS_STD_RESULT_OF 0
#endif
#endif
MSVC关于__cplusplus的文章:https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/