3 votes

Recherche en deux phases: est-il possible d'éviter le "gonflement du code"?

Question de recherche en deux phases : Existe-t-il un moyen plus synthétique d'écrire ce code, c'est-à-dire en évitant toutes ces directives using ? Quelque chose comme using CBase; est ce que je voudrais, mais ce n'est pas accepté.

#include 

template 
class CBase
{
protected:
    int a, b, c, d;   // et bien plus encore...

public:
    CBase() {
        a = 123; c = 0;
    }
};

template 
class CDer : public CBase
{
//  using CBase;     // erreur, mais c'est ce que je voudrais
    using CBase::a;
    using CBase::b;
    //...

public:
    CDer() {
        std::cout << a << this->c;
    }
};

int main()
{
    CDer cd;
}

Dans mon code réel, il y a beaucoup plus de variables/membres et de fonctions, et je me demandais s'il est possible d'écrire un code plus court d'une manière ou d'une autre.
Bien sûr, l'utilisation de la syntaxe this->c ne résout pas le problème...

Merci !


gcc 4.1 MacOS X 10.6

2voto

J'ai réduit le cas de test et ensuite considéré trois options

template struct Base { int a; };

Option 1

template struct Der : Base {
  void f() { 
    int &ra = Der::a;
    // maintenant utilisez ra
  }
}

Option 2

template struct Der : Base {
  void f() { 
    // utilisez this->a à la place
    // ou Der::a
  }
}

Option 3

// utilisez vos déclarations using

0voto

Potatoswatter Points 70305

Il semble que la plupart de ces variables ne soient pas paramétrées. Est-ce que CBase les utilise toutes, ou juste a? Sinon, déplacez-les dans une nouvelle base non-template de CDer.

Ou, regroupez-les toutes dans une structure POD et ensuite using CBase::m_ints;.

Solution à surcoût élevé: base virtual non templatisée.

Pas sûr mais ça vaut la peine d'essayer: imbriquez la définition de CDer à l'intérieur de CBase puis typedef le dans l'espace de noms.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X