C++ Eigen在行模板的可变模板扩展方面存在问题
我正在尝试创建一个使用C++ Eigen在行模板的可变模板扩展方面存在问题,c++,visual-studio,variadic-templates,eigen,C++,Visual Studio,Variadic Templates,Eigen,我正在尝试创建一个使用特征:矩阵的网格;有关图书馆,请参阅 让我们来看一小段代码: template<typename Types, int... Sizes> class Grid; template<typename... Types, int... Sizes> class Grid<std::tuple<Types...>, Sizes...> { public: using grid_type = std::tuple<E
特征:矩阵的网格
;有关图书馆,请参阅
让我们来看一小段代码:
template<typename Types, int... Sizes> class Grid;
template<typename... Types, int... Sizes>
class Grid<std::tuple<Types...>, Sizes...>
{
public:
using grid_type = std::tuple<Eigen::Matrix<Types, Sizes, 1>...>;
};
在编译VS2017时,我发现以下三个错误:
错误C3548“\u行”:参数包不能在此上下文中使用
错误C2976“特征::矩阵”:模板参数太少
错误C3546“…”:没有可扩展的参数包
错误C3203“矩阵”:非专用类模板不能用作模板参数“\u类型”的模板参数,应为实类型
现在,如果我们使用类似于std::array
的东西,那么即使使用-1参数,一切都很好(它只是转换为正的size\u t
):
使用grid\u type=std::tuple;
grid\u type
按预期显示
现在还有一个问题,VS的intellisense能够正确评估Eigen版本,但它无法编译它…好的,所以我找到了答案。由于
Eigen::Matrix
对某些构造函数参数使用默认值,在本例中,这些参数取决于Rows/Cols参数(其中Rows是可变模板),因此编译器会感到困惑。我明确列出了所有参数,并编译:
using grid_type = std::tuple<Eigen::Matrix<Types, Sizes, 1, Eigen::AutoAlign | false, Sizes,1>...>;
使用grid\u type=std::tuple;
然而,这仍然不能让我满意,因为intellisense可以处理这个问题,但编译器不能。好的,所以我找到了答案。由于
Eigen::Matrix
对某些构造函数参数使用默认值,在本例中,这些参数取决于Rows/Cols参数(其中Rows是可变模板),因此编译器会感到困惑。我明确列出了所有参数,并编译:
using grid_type = std::tuple<Eigen::Matrix<Types, Sizes, 1, Eigen::AutoAlign | false, Sizes,1>...>;
使用grid\u type=std::tuple;
然而,这仍然不能让我满意,因为intellisense可以处理这一点,但编译器不能。事实上,使用GCC、clang和ICC可以很好地编译,但使用MSVC却没有运气。以下是MSVC更好的解决方法:
template<typename Scalar,int Rows>
using Mat = Eigen::Matrix<Scalar, Rows, 1>;
using grid_type = std::tuple<Mat<Types,Sizes>...>;
模板
使用Mat=特征::矩阵;
使用grid_type=std::tuple;
事实上,这在GCC、clang和ICC中编译得很好,但在MSVC中编译得不好。以下是MSVC更好的解决方法:
template<typename Scalar,int Rows>
using Mat = Eigen::Matrix<Scalar, Rows, 1>;
using grid_type = std::tuple<Mat<Types,Sizes>...>;
模板
使用Mat=特征::矩阵;
使用grid_type=std::tuple;