如何在C ++ 14中定义静态constexpr矩阵?

时间:2019-07-12 19:05:46

标签: matrix constructor static c++14 constexpr

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

我认为thisMatrix类的起点。 然后,我想写一些东西:

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

因此staticmat是constexpr并且是唯一的,是静态的。

但是,为了对此进行初始化,我将需要一个constexpr数组或一个constexpr初始化列表(在我发布的链接中未实现,但不会有太大变化)。所以我可以这样写:

static constexpr std::array<double,4> staticmattmp{0.1,0.2,0.3,0.4};
static constexpr Matrix<double,2,2> staticmat(staticmattmp);

这将是丑陋的,因为我必须为一个定义两个东西,但是,如果可行,我可以接受。不幸的是,编译器说unknown type name 'staticmattmp'

我怎么可能以一种优雅的方式解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

我怎么可能以一种优雅的方式解决这个问题?

我不知道它是否优雅,但是...做了一点工作...

首先,定义以下using

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

下一次重新声明(仅声明;未定义)Matrix,如下所示

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

现在将您的Matrix声明为类局部专业化,添加一个构造函数,该构造函数接收NR*NC类型的T元素,并使用它们初始化内部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
 };

但不要忘记将析构函数(也可能是构造函数和default)声明为operator=()

以下是完整的C ++ 14示例

#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};
 }