模板的矩阵模板
Matrix template of template
我正在尝试实现一个简单的矩阵类模板我想像矩阵一样实例化它(data1 , .. , dataN)基本上我想定义一个模板类,它将 2 个无符号 int 作为模板参数,并使用初始化列表来推断现在包含的数据的类型,我写了这个简单的开始:
template<size_t N, size_t M>
class Matrix {
public:
template<typename ...T>
constexpr Matrix<N,M>(T ... args ) noexcept
: data{std::forward<T>(args)... }
{
static_assert(sizeof...(args) <= N*M, "Insufficent element for a Matrix " );
}
const auto getData()const { return data; }
private:
template<typename T>
std::valarray<T> data ;
};
但是我得到了一个错误..
错误:数据成员"数据"不能是成员模板 std::valarray data ;
那你怎么看? 有一种方法可以推断矩阵的类型通过她的初始化(传递给构造函数的参数)并使用此时间沿着所有类定义 ?
无法将template <typename T>
推迟到构造函数。在调用构造函数之前,矩阵需要知道它将存储什么T
,否则将无法计算矩阵对象的大小。因此,您必须像这样声明该类:
template <typename T, std::size_t N, std::size_t M>
class Matrix
{
public:
// Constructors and stuff
private:
std::valarray<T> data ;
};
(注:C++中没有size_t
类型,但有std::size_t
)
无法推断出这种T
是一件令人讨厌的事情。人们过去常常编写像std::make_pair
、std::make_tuple
等包装器,依靠函数的能力来推导他们的参数类型。
即将推出的 c++17 标准具有您想要的功能,称为类模板参数推导。它甚至允许人们指导扣除过程,如下所示:
template <typename T, std::size_t N>
struct array
{
T data[N];
template <typename ... X>
array (X ... x)
: data{x...}
{ }
};
template <typename ... X>
array(X ...) -> array<std::common_type_t<X...>, sizeof...(X)>;
不幸的是,在您的情况下,不可能派生N
和M
,因此您必须更改构造函数签名才能使用此功能。
相关文章:
- 没有找到相关文章