IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Générer des operateurs avec Boost.Preprocessor (ou Boost.operators)


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut Générer des operateurs avec Boost.Preprocessor (ou Boost.operators)
    J'essaye de générer des operateurs pour ma lib d'algèbre linéaire avec Boost.Preprocessor et ca marche pas.

    En detail, voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #define GEN_ALGEBRAIC_OPS_REP_MACRO(z, n, param)			\
    		BOOST_PP_TUPLE_ELEM(2, 0, param)					\
    		BOOST_PP_CAT(OPERATOR,								\
    			BOOST_PP_ARRAY_ELEM(n,							\
    				BOOST_PP_TUPLE_ELEM(2, 1, param)			\
    			)												\
    		)													\
    		(const BOOST_PP_TUPLE_ELEM(2, 0, param)& rlv) const \
    		{													\
    			BOOST_PP_TUPLE_ELEM(2, 0, param)	rv;			\
    			return rv;										\
    		}													\
     
    #define	GEN_ALGEBRAIC_OPS(type, size, operators)\
    		BOOST_PP_REPEAT_FROM_TO(				\
    			0,									\
    			BOOST_PP_ARRAY_SIZE(operators),		\
    			GEN_ALGEBRAIC_OPS_REP_MACRO,		\
    			(type, operators)					\
    		)										\
    En générant mes operateurs pour un vec2 (par exemple) de la facon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GEN_ALGEBRAIC_OPS(vec2, 2, ALGEBRAIC_OPS)
    avec ALGEBRAIC_OPS défini comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define ALGEBRAIC_OPS		(4, (Add, Sub, Mul, Div))
    cela me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vec2 operatorAdd (const vec2& rlv) const { vec2 rv; return rv; } 
    vec2 operatorSub (const vec2& rlv) const { vec2 rv; return rv; } 
    vec2 operatorMul (const vec2& rlv) const { vec2 rv; return rv; } 
    vec2 operatorDiv (const vec2& rlv) const { vec2 rv; return rv; }
    comme attendu, mais avec ALGEBRAIC_OPS définis comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define ALGEBRAIC_OPS		(4, (+, -, *, /))
    j'obtiens l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    error: pasting "operator" and "+" does not give a valid preprocessor token
    error: pasting "operator" and "-" does not give a valid preprocessor token
    error: pasting "operator" and "*" does not give a valid preprocessor token
    error: pasting "operator" and "/" does not give a valid preprocessor token
    des idées, voire des solutions?

  2. #2
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    Ok, c'était stupide comme solution mais efficace: "operator+" équivaut à "operator +", donc il suffit de ne pas concatener.

    le code final (rendu plus facile au passage):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #define	GEN_ALGEBRAIC_OP(type, size, op)					\
    		type												\
    		OPERATOR op											\
    		(const type& rhs) const		{						\
    			type rv;										\
    			for(int i = 0; i < size; i++)	{				\
    				rv._a[i] = this->_a[i] op rhs._a[i];		\
    			}												\
    			return rv;										\
    		}													\
     
    #define GEN_ALGEBRAIC_OPS_REP_MACRO(z, n, param)			\
    		GEN_ALGEBRAIC_OP(									\
    			BOOST_PP_TUPLE_ELEM(3, 0, param),				\
    			BOOST_PP_TUPLE_ELEM(3, 1, param),				\
    			BOOST_PP_ARRAY_ELEM(n,							\
    				BOOST_PP_TUPLE_ELEM(3, 2, param)			\
    			)												\
    		)													\
     
    #define	GEN_ALGEBRAIC_OPS(type, size, operators)\
    		BOOST_PP_REPEAT_FROM_TO(				\
    			0,									\
    			BOOST_PP_ARRAY_SIZE(operators),		\
    			GEN_ALGEBRAIC_OPS_REP_MACRO,		\
    			(type, size, operators)				\
    		)										\
    Au passage, quelqu'un s'est déjà servi du template operator et saurait me l'expliquer ?
    http://www.boost.org/doc/libs/1_36_0.../operators.htm

  3. #3
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    Je marque ce point comme résolu, mais je vais en ouvrir un autre sous peu pour la prochaine question sur Boost.pp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer des PDF avec FPDF
    Par debutantasp dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/04/2008, 14h18
  2. Générer des pdf avec Perl
    Par vincbruv dans le forum Modules
    Réponses: 1
    Dernier message: 13/02/2007, 16h19
  3. Générer des variables avec une boucle
    Par Anamelech dans le forum Delphi
    Réponses: 15
    Dernier message: 03/11/2006, 12h33
  4. Générer des mail avec pièce jointe au format PDF
    Par Michel DELAVAL dans le forum Access
    Réponses: 2
    Dernier message: 26/06/2006, 15h07
  5. Générer des statistiques avec graphiques, histogrammes
    Par nico33307 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/11/2005, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo