具有与行模板的变异模板扩展有关的EIGEN

Eigen having issues with variadic template expansion of the Rows template

本文关键字:EIGEN 扩展 变异      更新时间:2023-10-16

我正在尝试创建使用Eigen:Matrix的网格;请参阅此处的图书馆。

所以让我们看一下最少的代码:

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>...>;
};

,然后在main中,例如:

Grid<std::tuple<long, int>, -1, 10000>::grid_type;

我在编译时在VS2017中遇到以下三个错误:

错误c3548'_rows':在此上下文中无法使用参数包

错误c2976'eigen :: matrix':太少模板参数

错误c3546'...':没有参数包可以展开

错误c3203'矩阵':无专门的类模板不能用作模板参数参数'_ types',期望真实的类型

现在,如果我们要使用诸如std::array之类的东西,那么即使使用-1参数,一切都很好(嗯,它只是将其转换为正size_t(:

using grid_type = std::tuple<std::array<Types, Sizes>...>;

grid_type按预期出来。

现在是bizzare,VS的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>...>;

好的,所以我想出了。因为Eigen::Matrix使用某些构造函数参数使用默认值,在这种情况下,这取决于行/cols参数(其中行是变异模板(,则编译器会混淆。我明确列出了所有参数,并编译了:

using grid_type = std::tuple<Eigen::Matrix<Types, Sizes, 1, Eigen::AutoAlign | false, Sizes,1>...>;

但是,这仍然不满意我,因为Intellisense可以处理这是Wierd,但是编译器不能。