하나의 유형 인스턴스를 다른 유형 (예 : Matrix<int>
~ Matrix<double>
)으로 쉽게 변형 할 수있는 템플릿 매트릭스 클래스가 있습니다. 나에게캐스트 템플릿 (매트릭스) 클래스
#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
이 가장 직관적 인 방법은 (X 컴파일하지 않는 옵션 아래 NB 라인) 다음과 같은 두 가지 옵션 중 하나입니다 : 다음과 같이
클래스를 포함하는 헤더 파일 보인다
나는 (내가 사소한 일에 너무 정의 때문에 약 슈퍼 좋아 아니에요) 다음과 같은 솔루션을 사용하는 순간#include "matrix.h"
int main (void)
{
Matrix<int> matInt({5,5});
for (size_t i=0 ; i<matInt.size() ; i++)
matInt[i] = static_cast<int>(i);
// Option 1
Matrix<double> matDouble = matInt;
// Option 2
Matrix<double> matDouble = static_cast<Matrix<double>>(matInt);
return 0;
}
:
Matrix<double> as_double (void) {
Matrix<double> out(this->shape());
for (size_t i=0 ; i<this->size() ; i++)
out[i] = static_cast<double>(_data[i]);
return out;
}