Je n'aime pas trop utiliser les directives du préprocesseur, mais il y a des
cas où c'est quand même bien pratique... Je souhaiterai faire une définition
de classe template générique en fonction du nombre de paramètre template que
cette classe peut prendre.
-- fichier clgen.h --
si je fais: #define TEMPLATE_LIST LIST_TP(3) // ok
mais si: #define TEMPLATE_LIST LIST_TP(NBARGS) // marche pas :(
template <TEMPLATE_LIST>
class {....};
--------------------
Si je met directement la constante "3" à la macro LIST_TP(x) tout va bien
elle s'étend en LIST_TP3 ce qui est exactement ce que je veux. Mais si je
lui passe NBARGS, elle s'étend en LIST_TPNBARGS :(
Une idée ou une astuce pour faire ce que je veux hormis une batterie de test
du genre:
#if (NBARGS = ...)
#define TEMPLATE_LIST LIST_TP(...)
#elif ..
...
#endif
-- fichier clgen.h -- si je fais: #define TEMPLATE_LIST LIST_TP(3) // ok mais si: #define TEMPLATE_LIST LIST_TP(NBARGS) // marche pas :(
Essai comme ceci : #define _LIST_TP(x) LIST_TP##x
#define LIST_TP(x) _LIST_TP(x) et #define TEMPLATE_LIST LIST_TP(NBARGS) devrait fonctionner.
Cela provient du fait que l'opérateur ## concatène très exactement le symbole passé en paramêtre. Ta solution donnait donc "LIST_TPNBARGS". En passant par une macro intermédiaire, LIST_TP passera bien le résultat de l'évaluation de NBARGS à _LIST_TP et te donnera le bon "LIST_TP3".
-- fichier clgen.h --
si je fais: #define TEMPLATE_LIST LIST_TP(3) // ok
mais si: #define TEMPLATE_LIST LIST_TP(NBARGS) // marche pas
:(
Essai comme ceci :
#define _LIST_TP(x) LIST_TP##x
#define LIST_TP(x) _LIST_TP(x)
et
#define TEMPLATE_LIST LIST_TP(NBARGS)
devrait fonctionner.
Cela provient du fait que l'opérateur ## concatène très exactement le
symbole passé en paramêtre. Ta solution donnait donc "LIST_TPNBARGS".
En passant par une macro intermédiaire, LIST_TP passera bien le
résultat de l'évaluation de NBARGS à _LIST_TP et te donnera le bon
"LIST_TP3".
-- fichier clgen.h -- si je fais: #define TEMPLATE_LIST LIST_TP(3) // ok mais si: #define TEMPLATE_LIST LIST_TP(NBARGS) // marche pas :(
Essai comme ceci : #define _LIST_TP(x) LIST_TP##x
#define LIST_TP(x) _LIST_TP(x) et #define TEMPLATE_LIST LIST_TP(NBARGS) devrait fonctionner.
Cela provient du fait que l'opérateur ## concatène très exactement le symbole passé en paramêtre. Ta solution donnait donc "LIST_TPNBARGS". En passant par une macro intermédiaire, LIST_TP passera bien le résultat de l'évaluation de NBARGS à _LIST_TP et te donnera le bon "LIST_TP3".
#define CONCAT(x,y) x ## y #define LIST_TP(x) CONCAT(LIST_TP,x)
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
#define CONCAT(x,y) x ## y
#define LIST_TP(x) CONCAT(LIST_TP,x)
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
#define CONCAT(x,y) x ## y #define LIST_TP(x) CONCAT(LIST_TP,x)
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Frédéric Gourul
"Jean-Marc Bourguet" a écrit dans le message de news: