我试图实现一个简单的矩阵类模板,我想像矩阵一样实例化它(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数据;
那你觉得呢?有一种方法可以通过初始化(传递给构造函数的参数)推断矩阵的类型,并在所有类定义中使用这一次?
发布于 2017-10-20 09:11:10
无法将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 ;
};(注:size_t类型在C++中不存在,但存在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,因此您必须更改构造函数签名才能使用此特性。
https://stackoverflow.com/questions/46845652
复制相似问题