私は、1つのタイプのインスタンスを別のタイプ(例: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
私には、最も直感的な方法は、次の2つのオプション(オプション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;
}