Re: C++, template et pointeur

Top Page

Reply to this message
Author: Edgar Bonet
Date:  
To: guilde
Subject: Re: C++, template et pointeur
Bonjour !

Frédéric a écrit :
> [class Encoder { template <Encoder& instance> static void begin(); }]
> marche très bien si on appelle la méthode statique Encoder::begin()
> avec une référence sur un objet Encoder, mais comment faire pour
> l'appeler si on ne dispose que d'un pointeur sur un objet Encoder ?


Une ISR étant une fonction nue, les seules données auxquelles elle peut
accéder sont des variables globales ou statiques, dont l'adresse est
connue à la compilation. J'ai l'impression que tu es en train d'essayer
de contourner cette limitation par tous les moyens, mais ça ne pourra
jamais marcher.

> m_encoder = new Encoder(encoderPinA, encoderPinB, ticksPerTurn);
> Encoder::begin<*m_encoder>();


Un paramètre de template doit aussi être une constante connue à la
compilation. Tu ne peux pas utiliser quelque chose qui est créé
dynamiquement. Si tu veux appeler Encoder::begin() depuis un
constructeur (pas sûr que ce soit une bonne idée), tu pourrais
transformer la classe ClosedLoopMotor en un template:

    template <Encoder& encoder>
    class ClosedLoopMotor
    {
        public:
            ClosedLoopMotor(uint8_t, uint8_t, uint16_t);
    };


    template <Encoder& encoder>
    ClosedLoopMotor<encoder>::ClosedLoopMotor()
    {
        Encoder::begin<encoder>();
    }


À+,

Edgar.