Собственные проблемы с расширением шаблона variadic шаблона Rows - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь создать сетку, которая использует 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 выходит как положено.

Теперь, что также странно, intellisense VS способен правильно оценить версию Eigen, но не может ее скомпилировать ...

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Действительно, это прекрасно компилируется с 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>...>;
0 голосов
/ 25 апреля 2018

Хорошо, так что я понял это. Поскольку Eigen::Matrix использует значения по умолчанию для некоторых параметров конструктора, которые в этом случае зависят от параметра Rows / Cols (где Rows - это шаблон с переменным числом аргументов), компилятор запутывается. Я явно перечислил все параметры, и это скомпилировано:

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

Однако, это все равно меня не удовлетворяет, потому что странно, что intellisense может справиться с этим, но компилятор не может.

...