具有与行模板的变异模板扩展有关的EIGEN
Eigen having issues with variadic template expansion of the Rows template
我正在尝试创建使用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,但是编译器不能。
相关文章:
- Eigen如何在容器循环中干净地附加矩阵
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- 使用Pybind11向Python公开Eigen::张量
- C++中的VLA,扩展名为std=C++11
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- Eigen:调用lpNorm()的正确方法
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- Eigen c++ 三角形来自
- 使用 operator() 扩展 Eigen::EigenBase
- 具有与行模板的变异模板扩展有关的EIGEN
- 扩展 Eigen::Vector2d 的功能