C++ 模板的矩阵模板
我正在尝试实现一个简单的矩阵类模板 我想将其实例化为矩阵(data1,…,dataN) 基本上,我想定义一个以2 unsigned int作为模板参数的模板类,并使用初始化列表推断包含的数据类型,现在我编写了一个简单的开始:C++ 模板的矩阵模板,c++,templates,matrix,c++17,C++,Templates,Matrix,C++17,我正在尝试实现一个简单的矩阵类模板 我想将其实例化为矩阵(data1,…,dataN) 基本上,我想定义一个以2 unsigned int作为模板参数的模板类,并使用初始化列表推断包含的数据类型,现在我编写了一个简单的开始: template<size_t N, size_t M> class Matrix { public: template<typename ...T> constexpr Matrix<N,M>(T
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 ;
};
模板
类矩阵{
公众:
模板
constexpr矩阵(T…args)无例外
:数据{std::forward(args)…}
{
static_assert(sizeof…(args)无法将模板推迟到构造函数。在调用构造函数之前,矩阵需要知道它将存储什么T
,否则将无法计算矩阵对象的大小。因此,您必须像这样声明类:
template <typename T, std::size_t N, std::size_t M>
class Matrix
{
public:
// Constructors and stuff
private:
std::valarray<T> data ;
};
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
,因此您必须更改构造函数签名才能使用此功能。无法将模板推迟到构造函数。在调用构造函数之前,矩阵需要知道它将存储什么T
ed,否则将无法计算矩阵对象的大小。因此,您必须像下面这样声明类:
template <typename T, std::size_t N, std::size_t M>
class Matrix
{
public:
// Constructors and stuff
private:
std::valarray<T> data ;
};
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++14或更高版本中模板化成员变量,但无论如何,T
为什么不是整个类的参数?我希望typename T代码>作为第一个(或最后一个)类的模板参数。因为我会使用矩阵来实例化这些。所以类模板参数应该是…我可以在其中插入T??推断什么?我不知道成员变量是否可以在C++14或更高版本中模板化,但无论如何,T
为什么不是整个类的参数?我希望typename T
第一个(或最后一个)类的模板参数。因为我将使用矩阵来实例化这些。所以类模板参数应该是…我可以在其中插入T??推断什么?抱歉,我不明白…以哪种方式?@MarcoGhiani:只需将构造函数设置为非模板化,因为根据lisyarus的建议,您已经将T
作为类template参数。现在数据
也将是一个普通成员,而不是模板没有我没有…我有模板
对不起,我不明白…以哪种方式?@MarcoGhiani:只需将构造函数设为非模板化,因为根据lisyarus的建议,您已经将t
作为类模板参数。现在还有数据
将成为正式会员,而不是模板我没有…我有模板