Eigen在Rows模板的可变参数模板扩展方面存在问题

时间:2018-04-25 17:19:31

标签: c++ visual-studio variadic-templates eigen

我正在尝试创建一个使用Eigen:Matrix的网格;有关图书馆的信息,请参阅here

让我们看一下最小的代码:

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'Matrix':非专用类模板不能用作模板参数'_Types'的模板参数,期望是真实类型

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

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

grid_type按预期出现。

现在什么也是bizzare,VS的intellisense能够正确评估Eigen版本,但它无法编译...

2 个答案:

答案 0 :(得分:1)

好的,所以我明白了。因为Eigen::Matrix使用某些构造函数参数的默认值,在这种情况下,它们依赖于Rows / Cols参数(其中Rows是可变参数模板),因此编译器会感到困惑。我明确列出了所有参数,并编译:

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

但是,这仍然不能满足我的要求,因为智能感知可以解决这个问题,但编译器不能这样做。

答案 1 :(得分:1)

事实上,这与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>...>;