Я с нетерпением жду, чтобы реализовать шаблон модели ведущий / ведомый регистр для любого типа в 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&
до complex<int>::operator +
как это происходит с T
знак равно int
, Первым решением было написать все операторы C ++ внутри Reg, чтобы переслать их 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, также принимают во внимание 🙂
Задача ещё не решена.
Других решений пока нет …