Riistvara muutujana
Mis saab siis, kui enam ei piisa sellest, et riistvaraline ühik on tüüp, mitte aga muutuja ?
- Kui vähegi võimalik, siis tuleks probleem püüda lahendada siiski selliselt:
template <class InputPinX> bool IsNotSet(IntputPinX inputPin) { return !inputPin.IsSet(); } // IsNotSet int main() { InputPin1<PortD> input; input.InitInput(); while (IsNotSet(input) ) ; return 0; } // main
- Kui eeltoodud kood aga vajadusi ei täida, siis võib teha ka nii:
- Defineerida interface vajaminevate funktsioonidega:
class IUSART { public: bool Read(uint8_t &data) = 0; void Write(uint8_t data) = 0; };
- Defineerida template klass, mis vastab defineeritud interface'le.
template <class USARTX> class AnyUSART : public IUSART { public: bool Read(uint8_t &data) { return USARTX::Read(data); } void Write(uint8_t data) { USARTX::Write(data); } };
- Ja ongi valmis:
uint8_t ReadAndWrite(IUSART *usart, uint8_t data) { usart.Write(data); usart.Read(data); return data; } // ReadAndWrite int main() { AnyUSART<USART0> u1; AnyUSART<USART1> u2; IUSART *u = &u1; ReadAndWrite(u, 5); u = &u2; ReadAndWrite(u, 8); return 0; } // main