C++ 铸造模板(矩阵)类
我有一个模板矩阵类,我想从中直观地将一种类型的实例转换为另一种类型的实例(例如,C++ 铸造模板(矩阵)类,c++,C++,我有一个模板矩阵类,我想从中直观地将一种类型的实例转换为另一种类型的实例(例如,matrix到matrix) 包含该类的头文件如下所示: #ifndef MATRIX_H #define MATRIX_H #include <cstdlib> #include <vector> template <class T> class Matrix { private: std::vector<T> _data; st
matrix
到matrix
)
包含该类的头文件如下所示:
#ifndef MATRIX_H
#define MATRIX_H
#include <cstdlib>
#include <vector>
template <class T> class Matrix
{
private:
std::vector<T> _data;
std::vector<size_t> _shape;
std::vector<size_t> _strides;
public:
Matrix (const Matrix<T> &) = default;
Matrix<T>& operator= (const Matrix<T> &) = default;
Matrix<T>(){};
// explicit constructor
Matrix<T>( size_t nrow , size_t ncol )
{
_shape.push_back(nrow);
_shape.push_back(ncol);
while ( _data.size()<_shape[0]*_shape[1] )
_data.push_back((T)0);
};
T& operator[] ( size_t i )
{ return _data[i]; };
T& operator() ( size_t i, size_t j )
{ return _data[i*_shape[1]+j]; };
size_t size ( void ) const
{ return _data.size(); };
std::vector<size_t> shape ( void ) const
{
std::vector<size_t> ret(2);
for ( size_t i=0 ; i<2 ; i++ )
ret[i] = _shape[i];
return ret;
};
};
#endif
#ifndef矩阵
#定义矩阵
#包括
#包括
模板类矩阵
{
私人:
std::vector_数据;
std::向量_形;
std::矢量_步;
公众:
矩阵(常数矩阵&)=默认值;
矩阵和运算符=(常数矩阵&)=默认值;
矩阵(){};
//显式构造函数
矩阵(大小为NOW,大小为ncol)
{
_形状。向后推(nrow);
_形状。推回(ncol);
而(_data.size()shape());
对于(size_t i=0;isize();i++)
out[i]=静态数据转换(数据[i]);
返回;
}
您需要定义一个“模板复制构造函数”(某种类型)。让我们从清理现有构造函数开始:
Matrix<T>( size_t nrow , size_t ncol )
template<typename From>
Matrix(const Matrix<From> &s)
然后,定义一个模板化的伪复制构造函数:
Matrix<T>( size_t nrow , size_t ncol )
template<typename From>
Matrix(const Matrix<From> &s)
模板
矩阵(常数矩阵和s)
现在,编写这个构造函数,就像编写副本构造函数一样
之后,还应该编写一个模板化赋值运算符
template<typename From>
Matrix &operator=(const Matrix<From> &f)
模板
矩阵和运算符=(常数矩阵和f)
再次,假设这是一个普通的赋值运算符,并完成实现一个赋值运算符的过程。您需要定义一个“模板副本构造函数”(某种类型)。让我们从清理现有构造函数开始:
Matrix<T>( size_t nrow , size_t ncol )
template<typename From>
Matrix(const Matrix<From> &s)
然后,定义一个模板化的伪复制构造函数:
Matrix<T>( size_t nrow , size_t ncol )
template<typename From>
Matrix(const Matrix<From> &s)
模板
矩阵(常数矩阵和s)
现在,编写这个构造函数,就像编写副本构造函数一样
之后,还应该编写一个模板化赋值运算符
template<typename From>
Matrix &operator=(const Matrix<From> &f)
模板
矩阵和运算符=(常数矩阵和f)
再次,假设这是一个普通的赋值运算符,并进行实现。std::vector
不能赋值给std::vector
,因此您不能只分配成员,而必须显式地进行转换
你可以写一封信
模板
算子矩阵(){
矩阵矩阵(shape()[0],shape()[1]);
对于(大小i=0;i
如果(#include
)可以删除启用,但我建议保留它,因为它不允许矩阵mat=Matrix()的静默通过。
另外,在您的ctor中使用\u data.resize(\u shape[0]*\u shape[1])
可能是一个好主意,因为您当前有不必要的算法复杂性。std::vector
不能分配给std::vector
,因此您不能只分配您的成员,而必须显式地进行转换
你可以写一封信
模板
算子矩阵(){
矩阵矩阵(shape()[0],shape()[1]);
对于(大小i=0;i
如果(#include
)可以删除启用,但我建议保留它,因为它不允许矩阵mat=Matrix()的静默通过。
另外,在您的ctor中使用\u data.resize(\u shape[0]*\u shape[1]);
可能是一个好主意,因为您当前有不必要的算法复杂性