Matrix 如何在c++;14?

Matrix 如何在c++;14?,matrix,constructor,static,c++14,constexpr,Matrix,Constructor,Static,C++14,Constexpr,我目前正在使用C++14。 我想定义一个Matrix类,我可以用它定义运行时矩阵,也可以定义constepr矩阵。我还想基于这样一个类定义静态constexpr矩阵 我认为是矩阵< /代码>类的起点。 然后我想写一些东西如下: static constexpr Matrix<double,2,2> staticmat{0.1,0.2,0.3,0.4}; 这将是丑陋的,因为我必须为一个定义两件事,但是,如果它起作用,我可以接受它。不幸的是,编译器说未知类型名'staticmattmp

我目前正在使用C++14。 我想定义一个
Matrix
类,我可以用它定义运行时矩阵,也可以定义constepr矩阵。我还想基于这样一个类定义静态constexpr矩阵

我认为是<代码>矩阵< /代码>类的起点。 然后我想写一些东西如下:

static constexpr Matrix<double,2,2> staticmat{0.1,0.2,0.3,0.4};
这将是丑陋的,因为我必须为一个定义两件事,但是,如果它起作用,我可以接受它。不幸的是,编译器说
未知类型名'staticmattmp'

我怎样才能解决这个问题,也许是用一种优雅的方式

我怎样才能解决这个问题,也许是用一种优雅的方式

我不知道它是否优雅,但是。。。只要一点点努力

首先,使用

template <typename T, std::size_t>
using getType = T;
现在将您的
矩阵
声明为类部分专门化,添加一个构造函数,该构造函数接收类型为
T
NR*NC
元素,并使用它们初始化内部
std::array

template <typename T, std::size_t NR, std::size_t NC, std::size_t ... Is>
class Matrix<T, NR, NC, std::index_sequence<Is...>>
 {
   public:
       using value_type = T;

      constexpr Matrix (getType<value_type, Is> ... vals)
         : values_{{vals...}}
       {}

      // other member and methods
 };

非常感谢。基本上,我们需要定义getType来创建一个变量,比如“T…”。此外,由于本例中的所有内容都在constexpr中,因此我们可以将编译时参数作为模板参数(double,2,2),也可以作为构造函数参数。我说得对吗?
template <typename, std::size_t NR, std::size_t NC,
          typename = std::make_index_sequence<NR*NC>>
class Matrix;
template <typename T, std::size_t NR, std::size_t NC, std::size_t ... Is>
class Matrix<T, NR, NC, std::index_sequence<Is...>>
 {
   public:
       using value_type = T;

      constexpr Matrix (getType<value_type, Is> ... vals)
         : values_{{vals...}}
       {}

      // other member and methods
 };
#include <array>
#include <type_traits>

template <typename T, std::size_t>
using getType = T;

template <typename, std::size_t NR, std::size_t NC,
          typename = std::make_index_sequence<NR*NC>>
class Matrix;

template <typename T, std::size_t NR, std::size_t NC, std::size_t ... Is>
class Matrix<T, NR, NC, std::index_sequence<Is...>>
 {
   public:
      using value_type = T;

      constexpr Matrix (getType<value_type, Is> ... vals)
         : values_{{vals...}}
       {}

      constexpr Matrix (std::array<T, NR*NC> const & a)
         : values_{a}
       {}

      constexpr Matrix (std::array<T, NR*NC> && a)
         : values_{std::move(a)}
       {}

      constexpr Matrix () = default;

      ~Matrix() = default;

      constexpr Matrix (Matrix const &) = default;
      constexpr Matrix (Matrix &&) = default;

      constexpr Matrix & operator= (Matrix const &) = default;
      constexpr Matrix & operator= (Matrix &&) = default;


      constexpr T const & operator() (std::size_t r, std::size_t c) const
       { return values_[r*NC+c]; }

      T & operator() (std::size_t r, std::size_t c)
       { return values_[r*NC+c]; }

      constexpr std::size_t rows () const
       { return NR; }

      constexpr std::size_t columns () const
       { return NC; }

   private:
      std::array<T, NR*NC> values_{};
 };

int main()
 {
   static constexpr Matrix<double,2,2> staticmat{0.1,0.2,0.3,0.4};
 }