Salut,
A mon sens, tu gagnera énormément en modularité et en souplesse avec les template, et principalement avec les traits de politiques et les politiques 
.
De plus, tu t'évitera sans doute bien des recopies manuelles de code, et tu limitera de ce fait les risques d'erreur 
En effet, l'utilisation des directives préprocesseurs devrait être, à mon sens, limitée à quelques points particuliers:- l'inclusion des fichiers d'en-tête ( directive #include )
 - les garde anti inclusion (directives #ifndef MACHINCHOSE_H #define #endif) qui entourent le contenu de l'en-tête
 - Le choix de l'exportation ou non et de l'importation ou non (lorsque l'on envisage de créer éventuellement une dll)
 - Quelques cas permettant de simplifier l'écriture
 
Le dernier point serait celui qui permettrait de remplacer un code proche de
	
	typedef TypeList<int,<TypeList<char,TypeList<double,NullType> > > malist;
 en quelque chose proche de 
	
	typedef TYPELIST_3(int, char, double) malist;
 (exemple personnel basé sur la bibliothèque Loki)
En effet, imagine, simplement, que tu  doive avoir recours dans un code à deux options a priori incompatibles entre elles...
Si tu décide d'utiliser les directives préprocesseurs, tu devra, dans le meilleur des cas, créer deux fichiers d'implémentation, dans le pire, veiller à "dé définir" chaque symbole défini et à "ré-inclure" le fichier d'en-tête. avant de recopier quasi mot à mot le code dont tu as besoin, sous une forme proche de
	
	1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
   | #define VALEUR1 true
#define VALEUR2 false
/*...
 * Macros.h se base sur la définition de VALEUR1 et de VALEUR2
 * pour définir d'autres macros ;)
 */
#include "Macros.h"
/* le code adapté à VALEUR1 et VALEUR2
 * et utilisant ce qui est défini dans Macros.h
 */
#undef VALEUR1
#undef VALEUR2
/* pour permettre la ré inclusion de Macros.h
 */
#undef MACROS_H
/* il ne faudrait pas oublier de dé définir les différentes
 * marcros en question
 * ...
 */
/* changeons les valeurs */
#define VALEUR1 false
#define VALEUR2 true
/* ré inclusion de macros.h */
#include "macros.h"
/*et continuons notre code */  | 
 Alors que si tu utilises correctement les traits de politiques et les politiques, tu peux en arriver à quelque chose proche de
	
	1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
   | struct Politique1_vrai
{
    void doSomething(){/*...*/}
};
struct Politique1_faux
{
    void doSomething(){/*...*/}
};
struct Politique2_vrai
{
    void doOtherThing(){/*...*/}
};
struct Politique2_faux
{
    void doOtherThing(){/*...*/}
};
template <class Pol1, class Pol2>
class Work:public Pol1, public Pol2
{
    private:
        /* quelques données intéressantes */
};
/* Dans l'implémentation:
 * Je veux utiliser Politique1_vrai et politique2_vrai...
 */
typedef Work<Politique1_vrai,politique2_vrai> WorkVraiVrai;
WorkVraiVrai wvv;
wvv.doSomenthing();
wvv.doOtherThing();
 
/* Je veux utiliser il existe 4 possibilités différentes, et nous pouvons 
 * chaque fois créer un type qui correspond par simple typedef (pour la
 * facilité d'écriture ;)) sans avoir à réécrire une ligne de code 
 * supplémentaire
 * 
 * Le mieux de tout, c'est que nous n'aurons pas de problème
 * avec les différentes options incompatibles
 */ | 
 
						
					
Partager