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:
  1. Defineerida interface vajaminevate funktsioonidega:
    class IUSART
    {
    public:
        bool Read(uint8_t &data) = 0;
        void Write(uint8_t data) = 0;
    };
  2. 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); }
    };
  3. 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