Matrix 如何在c++;14?
我目前正在使用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
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};
}