1

マトリックスクラスを作成しました:

template <typename T>
class Matrix
{
public:
    Matrix(size_t n_rows, size_t n_cols);
    Matrix(size_t n_rows, size_t n_cols, const T& value);

    void fill(const T& value);
    size_t n_rows() const;
    size_t n_cols() const;

    void print(std::ostream& out) const;

    T& operator()(size_t row_index, size_t col_index);
    T operator()(size_t row_index, size_t col_index) const;
    bool operator==(const Matrix<T>& matrix) const;
    bool operator!=(const Matrix<T>& matrix) const;
    Matrix<T>& operator+=(const Matrix<T>& matrix);
    Matrix<T>& operator-=(const Matrix<T>& matrix);
    Matrix<T> operator+(const Matrix<T>& matrix) const;
    Matrix<T> operator-(const Matrix<T>& matrix) const;
    Matrix<T>& operator*=(const T& value);
    Matrix<T>& operator*=(const Matrix<T>& matrix);
    Matrix<T> operator*(const Matrix<T>& matrix) const;

private:
    size_t rows;
    size_t cols;
    std::vector<T> data;
};

次に、さまざまなタイプのマトリックス間の操作を有効にしたいと思います。たとえば、次のようになります。

Matrix<int> matrix_i(3,3,1); // 3x3 matrix filled with 1
Matrix<double> matrix_d(3,3,1.1); // 3x3 matrix filled with 1.1

std::cout << matrix_i * matrix_d << std::endl;

私はこのようにすることを考えました(正しい方法ですか?):

template<typename T> // Type of the class instantiation
template<typename S>
Matrix<T> operator*(const Matrix<S>& matrix)
{
   // Code
}

double 行列に整数行列を掛けると、これはうまくいくと思います。新しい double 行列が得られます。問題は、整数行列に double 行列を掛けると、取得した行列が整数行列になるため、一部の情報が失われることです...そうですか? この動作を修正するにはどうすればよいですか?

std::cout << matrix_d * matrix_i << std::endl; // Works: I obtain a 3x3 matrix full of 1.1
std::cout << matrix_i * matrix_d << std::endl; // Doesn't work: I obtain a 3x3 matrix full of 1 instead of 1.1
4

1 に答える 1

4

operator*必要なことを行うには、を返すを提供する必要がありMatrix<X>ます。Xは、最大の範囲/最大の精度を持つ型です。

手元に C++11 コンパイラがある場合は、次を使用できます。

template <typename T, typename U>
auto operator*( Matrix<T> const & lhs, Matrix<U> const & rhs) 
     -> Matrix< delctype( lhs(0,0) * rhs(0,0) ) >
{
   Matrix< delctype( lhs(0,0) * rhs(0,0) ) > result( lhs );
   result *= rhs;
   return result;
}

operator*=の他のインスタンス化との乗算を可能にするテンプレートとして実装しMatrix<T>、変換コンストラクターがあると仮定します。

于 2012-08-19T12:40:44.850 に答える