我期待为 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,无论是固有的还是用户定义的类。
问题
当使用 example 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&
之前的选择。第一个解决方案是在 Reg 中编写所有 C++ 运算符以将它们转发到. 有更好的解决方案吗?complex<int>::operator +
T
int
d
上一个解决方案之后的第二个问题(转发运营商)
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 的解决方案也在考虑中:)