Извлечь значение параметра шаблона из шаблона псевдонима - PullRequest
0 голосов
/ 01 апреля 2020

Я делаю шаблон псевдонима класса Matrix Эйгена, и мне было интересно, можно ли извлечь значение из одного из «неиспользуемых» параметров шаблона.

enum MatrixType{
    FOO,
    BAR
};
template<int ROWS, int COLS, MatrixType FOO>
using Matrix = Eigen::Matrix<double, ROWS, COLS>

Я хочу иметь возможность извлечь значение MatrixType на более позднем этапе (в частности, в плагине MatrixBase, но не связан). Я видел подходы на этом сайте, такие как:

template<template <MatrixType> typename T, MatrixType N>
constexpr MatrixType extract(const T<N>&) { return N; }

Но я не смог согласовать это с моей конкретной ситуацией c. Спасибо за любые рекомендации.

1 Ответ

0 голосов
/ 01 апреля 2020

Простое решение, которое (к сожалению) не включает шаблон псевдонимов, может выглядеть следующим образом: ссылка :

struct Eigen{
    //struct that simulates Eigen
    template<typename T, auto ROWS, auto COLS>
    struct Matrix{};
};

enum MatrixType{FOO, BAR};

template<int ROWS, int COLS, MatrixType enum_para>
struct Matrix{
    static constexpr MatrixType enum_type = enum_para;
    using eigen_matrix_t = Eigen::Matrix<double, ROWS, COLS>;
};


template<auto rows, auto cols, MatrixType enum_para>
constexpr auto myFunction(Matrix<rows, cols, enum_para> myObject){

    return 0;

}

int main()
{
    Matrix<2,2,FOO> my_matrix; //declare struct

    decltype(my_matrix)::eigen_matrix_t matrix_a; //access eigen
    auto my_enum_a = decltype(my_matrix)::enum_type; //access matrixType enum

    Matrix<2,2,FOO>::eigen_matrix_t matrix_b;
    auto my_enum_b = Matrix<2,2,FOO>::enum_type;

    auto result = myFunction(my_matrix);

    return 0;
}
...