1

Matrixクラスを作成する必要があり、演算子をオーバーロードする際に問題が発生しました

<<演算子を使用して行列を埋めたい

Matrix<double> u3(2,2);

u3 << 3.3, 4, 3, 6;


template<class T>
Matrix<T> Matrix<T>::operator <<(T in){
    //Fill up the matrix, m[0] = 3.3, m[1]=4...
    return *this;
}

この演算子をどのようにオーバーロードしますか?

4

2 に答える 2

3

カンマを使用したアプローチは次のとおりです。

#include <iostream>
using namespace std;

struct Matrix {

    struct Adder {
        Matrix& m;
        int index;

        Adder(Matrix& m) : m(m), index(1) {}

        Adder& operator,(float value) {
            m.set(index++, value);
            return *this;
        }    
    };

    void set(int index, float value) {
        // Assign value to position `index` here.
        // I'm just printing stuff to show you what would happen...
        cout << "Matrix[" << index << "] = " << value << endl;
    }

    Adder operator<<(float value) {
        set(0, value);
        return Adder(*this);
    }

};

デモ: http: //ideone.com/W75LaH

いくつかの説明:

構文matrix << 5, 10, 15, 20は2つのステップで実現されます。

  • matrix << 5最初に評価されます。最初の要素を5に設定し、それ以降の挿入を処理する一時Adderオブジェクトを返します(次の挿入のインデックスを記憶します)
  • Adderoperator,各コンマの後に次の挿入を実行するオーバーロードがあります。
于 2012-11-22T11:08:17.153 に答える
1

このようなアプローチはうまくいくでしょう:

#include <iostream>


template <typename T>
class Mat {
public:
  T val; 
};

template <typename T>
Mat<T>& operator<<(Mat<T>& v, T in) {
  std::cout << in << " ";
  return v;
}

int main() {
  Mat<int> m;
  m << 1 << 2 << 3;
}

私はfreeoperator<<関数を使用しており、値の間にコンマを使用しないことに注意してください。

于 2012-11-22T11:01:43.137 に答える