我正在尝试实现一个简单的 Matrix 类模板 我想像 Matrix(data1 , .. , dataN) 一样实例化它 基本上我想定义一个模板类,它将 2 unsigned 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 ;
};
但是我得到了一个错误..
error: data member ‘data’ cannot be a member template 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标准具有您想要的功能,称为 class template argument deduction .它甚至允许人们指导演绎过程,如下所示:
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
,因此您必须更改构造函数签名才能使用此功能。
关于c++ - 模板矩阵模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46845652/