1

我期待为 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 +Tintd

上一个解决方案之后的第二个问题(转发运营商)

Reg<complex<int> > rc1;
complex<int> c2;
rc1 + c2; // work fine
c2 + rc1; // no match for ‘operator+’ in complex<int>

全球问题

是否有通用解决方案将应用于 Reg 实例的所有运算符(在读取模式下)转发给对象,并在使用类型对象进行操作时d自动将 Reg 实例转换为类型?dd

使用 C++11 的解决方案也在考虑中:)

4

0 回答 0