C++ で任意の型のマスター/スレーブ レジスタ モデル テンプレートを実装することを楽しみにしています。私は始めました:
template <typename T>
struct Reg {
Reg() {}
Reg& operator = (const T& d) {
this->d = d;
return *this;
}
Reg& operator = (const Reg& r) {
d = r.q;
return *this;
}
operator T& () {
return q;
}
void update() {
q = d;
}
T d; /** input */
T q; /** output */
};
アイデア
Reg インスタンスへの代入を行うときのアイデアは に書き込むことd
ですが、Reg インスタンスから読み取るときのアイデアはq
、組み込みクラスまたはユーザー定義クラスのいずれかの型 T について、 から読み取ることです。
問題
たとえばT
=を使用するint
と正常に動作しますが、T
std:complex などのユーザー定義型を使用すると失敗します。
例
Reg<int> a;
a = a + a; // work fine
Reg<complex<int> > b;
b = b + b; // no match for ‘operator+’ in ‘b + b’
=の場合と同様に、コンパイラがReg::operator T&
以前に選択することを期待していました。最初の解決策は、すべての C++ 演算子を Reg 内に記述して、これらを に転送することでした。より良い解決策はありますか?complex<int>::operator +
T
int
d
前の解決策の後の 2 番目の問題 (オペレーターの転送)
Reg<complex<int> > rc1;
complex<int> c2;
rc1 + c2; // work fine
c2 + rc1; // no match for ‘operator+’ in complex<int>
グローバルな質問
Reg インスタンスに適用されたすべての演算子 (読み取りモード) をオブジェクトに転送し、型オブジェクトで操作を行うときにd
Reg インスタンスを型に自動的にキャストする一般的な解決策はありますか?d
d
C++11 を使用したソリューションも考慮されています :)